当前位置: 首页 > news >正文

C#中数组ProtoBuf使用问题

使用 C# 类库 Google.Protobuf 包,进行协议定义,当给数组属性赋值默认值时,出现反序列化以后,数组长度翻倍,多的一部分在最前面,而且都是数组元素的默认值 

Code:

// 类定义
[ProtoContract]
public class ArrayClass
{[ProtoMember(1)]public int[] Array1 { get; set; } = new int[2];[ProtoMember(2)]public int[] Array1NoDefault { get; set; }[ProtoMember(3)]public int[] Array1Raw = new int[2];[ProtoContract]public class InnerClass{[ProtoMember(1)]public string Ele { get; set; }}[ProtoMember(4)]public InnerClass[] Array2 { get; set; } = new InnerClass[2];[ProtoMember(5)]public InnerClass[] Array2Raw = new InnerClass[2];
}// 操作如下
{var arrayClass = new ArrayClass();arrayClass.Array1NoDefault = new int[2];Array.Fill(arrayClass.Array1, 1);Array.Fill(arrayClass.Array1NoDefault, 1);Array.Fill(arrayClass.Array1Raw, 1);ArrayClass.InnerClass innerClass = new(){Ele = "2",}; Array.Fill(arrayClass.Array2, innerClass);Array.Fill(arrayClass.Array2Raw, innerClass);Log.Debug(JsonHelper.ToJson(arrayClass));var bytes = ProtobufHelper.ToBytes(arrayClass);var arrayClass1 = ProtobufHelper.FromBytes(typeof(ArrayClass), bytes);Log.Debug(JsonHelper.ToJson(arrayClass1));
}// Log.Debug输出如下:
/*
原类输出Json输出
{"Array1":[1,1],"Array1NoDefault":[1,1],"Array2":[{"Ele":"2"},{"Ele":"2"}],"Array1Raw":[1,1],"Array2Raw":[{"Ele":"2"},{"Ele":"2"}]}ProtoBuf后再反序列化Json输出
{"Array1":[0,0,1,1],"Array1NoDefault":[1,1],"Array2":[null,null,{"Ele":"2"},{"Ele":"2"}],"Array1Raw":[0,0,1,1],"Array2Raw":[null,null,{"Ele":"2"},{"Ele":"2"}]}
*///  可以发现 除了 Array1NoDefault其它 数组的长度增加了一倍,且全是数组元素的默认值

这个bug如果没有仔细观察会以为是逻辑代码的问题,解决办法就是,在定义数组时,不给默认值,用的时候再new, 就像例子中 Array1NoDefault  定义那样。

相关文章:

  • c# 二维图形绘制实践
  • 【Python高级编程】OpenCV来处理视频数据
  • 【数据结构(邓俊辉)学习笔记】二叉搜索树02——查找、插入和删除
  • mysql对VARCHAR和int的误解
  • c++ | 动态编译|虚函数表|虚函数
  • HTML和CSS基础(二)
  • 航空电子设备 MIL-STD-1553 收发器 HI-1573 / HI-1574
  • LinkedList与链表
  • Kubernetes面试整理-Kubernetes的主要组件有哪些?
  • SpringBoot三层架构
  • 高分论文密码---大尺度空间模拟预测与数字制图
  • 使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)
  • 【机器学习】第2章 线性回归及最大熵模型
  • Android Room数据库使用介绍
  • SpringBoot3 整合 Mybatis 完整版
  • 2017 年终总结 —— 在路上
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Cookie 在前端中的实践
  • httpie使用详解
  • jquery cookie
  • Koa2 之文件上传下载
  • Redis学习笔记 - pipline(流水线、管道)
  • Vim 折腾记
  • vue-router的history模式发布配置
  • 从零开始学习部署
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 配置 PM2 实现代码自动发布
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 Docker 部署 Spring Boot项目
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • #### golang中【堆】的使用及底层 ####
  • #考研#计算机文化知识1(局域网及网络互联)
  • (2)STM32单片机上位机
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (BFS)hdoj2377-Bus Pass
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)PySpark3:SparkSQL编程
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (九十四)函数和二维数组
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (七)glDrawArry绘制
  • (三)SvelteKit教程:layout 文件
  • (转)LINQ之路
  • (转载)利用webkit抓取动态网页和链接
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件设置了忽略但不生效
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 项目指定SDK版本
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .netcore 获取appsettings
  • .NET连接MongoDB数据库实例教程
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • []error LNK2001: unresolved external symbol _m