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  定义那样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂笔试真题讲解—美团23年—小美的字符串变换

本题主要讲解小美的字符串变换的要点和细节,根据步骤一步步思考方便理解 提供c的核心代码以及acm模式代码,末尾 题目描述 小美拿到了一个长度为 n 的字符串,她希望将字符串从左到右平铺成一个矩阵(先平铺第一行,然后是…

【使用python如何获取excel中sheet页的样式】

在Python中,要获取Excel文件中sheet页的样式(如字体、颜色、边框等),你通常会使用openpyxl(用于处理.xlsx文件)或xlrd和xlwt(用于处理较旧的.xls文件,但xlrd的新版本已不再支持.xlsx…

【C++提高编程-05】----C++之Deque容器实战

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

MySQL的三种重要的日志

日志 Mysql有三大日志系统 Undo Log(回滚日志):记录修改前的数据,用于事务回滚和 MVCC(多版本并发控制)。 Redo Log(重做日志):记录数据变更,用于崩溃恢复&…

【java】指定类,指定package,找到package下面,这个类的所有子类

目录 ■java代码 ■注意 ■运行效果 ■包的结构 ■java代码 package com.sxz.study.reflect;import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List;public class …

缓存技术实战[一文讲透!](Redis、Ecache等常用缓存原理介绍及实战)

目录 文章目录 目录缓存简介工作原理缓存分类1.按照技术层次分类2.按照应用场景分类3.按照缓存策略分类 应用场景1.硬件缓存2.软件缓存数据库缓存Web开发应用层缓存 3.分布式缓存4.微服务架构5.移动端应用6.大数据处理7.游戏开发 缓存优点缓存带来的问题 常见常用Java缓存技术1…

Unity 之通过自定义协议从浏览器启动本地应用程序

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity 之通过自定义协议从浏览器启动本地应用程序 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进…

树莓派等Linux开发板上使用 SSD1306 OLED 屏幕,bullseye系统 ubuntu,debian

Raspberry Pi OS Bullseye 最近发布了,随之而来的是许多改进,但其中大部分都在引擎盖下。没有那么多视觉差异,最明显的可能是新的默认桌面背景,现在是大坝或湖泊上的日落。https://www.the-diy-life.com/add-an-oled-stats-display-to-raspberry-pi-os-bullseye/ 通过这次操…

Spring中获取bean的三种常用方式

在Spring框架中,一个bean是指由SpringIOC容器管理的一个Java对象。Spring提供了一种依赖注入的机制,可以通过在配置文件中配置bean的定义,实现在代码中通过IOC容器获取bean的实例。 方法一 根据名称获取Bean public class App {public sta…

ArrayList<Integer>()转为int[]的几种方式

目录 方法1:使用Arrays类中的copyOfRange方法 示例代码(方法一) 方法2:利用Java Streams 示例代码(方法二) 注意事项 方法1:使用Arrays类中的copyOfRange方法 Arrays.copyOfRange()可以用…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 特惠寿司(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 特惠寿司(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

王思聪日本街头在被偶遇

王思聪日本街头再被偶遇,甜蜜约会日常成网友热议焦点近日,有网友在日本街头再次偶遇了“国民老公”王思聪,这次他不仅携带着一位美丽的女友,还展现出了两人之间亲密无间的互动,让不少网友感叹:这真的是每天…

如何使用 STARTTLS 加密 OpenLDAP 连接

简介 OpenLDAP提供了一个灵活且得到良好支持的LDAP目录服务。然而,默认情况下,服务器本身是通过未加密的网络连接进行通信的。在本指南中,我们将演示如何使用STARTTLS加密连接到OpenLDAP,以将传统连接升级为TLS。我们将使用Ubunt…

八、BGP

目录 一、为何需要BGP? 二、BGP 2.1、BGP邻居 2.2、BGP报文 2.3、BGP路由 2.4、BGP通告遵循原则 2.5、BGP实验 第一步:建立邻居 第二步:引入路由 BGP路由黑洞 路由黑洞解决方案 1、IBGP全互联 2、路由引入 3、MPLS 多协…

甘肃这款饼子很火 你是否有吃过呢

白吉饼那独特的外形,圆圆的十分可爱。👏它的表皮酥脆,内里绵软,麦香四溢。😋拿在手里沉甸甸的,就知道用料十足。 无论是直接吃,感受那纯粹的面香,还是夹上腊汁肉,变成美味…

web前端换行命令:深入解析与实用技巧

web前端换行命令:深入解析与实用技巧 在Web前端开发中,换行命令是一项基础而重要的技能。它涉及到文本排版、布局控制以及用户体验的多个方面。本文将通过四个方面、五个方面、六个方面和七个方面的详细阐述,带您深入了解Web前端换行命令的奥…

ThinkPHP5.0 apache服务器配置URL重写,index.php去除

本地环境wamp .htaccess文件代码 <IfModule mod_rewrite.c>Options FollowSymlinks -MultiviewsRewriteEngine onRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] </IfModule> 踩过这个坑&a…

关于编程思想

面向过程思想 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次调用就可以了 JS就是典型的面向过程的编程语言 优点&#xff1a; 性能比面向对象高&#xff0c;适合跟硬件联系很紧密的东西&…

000.双指针方法题解目录

000.双指针方法题解目录 167. 两数之和 II - 输入有序数组&#xff08;中等&#xff09;

dbForge Studioor MySQL v6 解锁版 安装教程(MYSQL数据库客户端)

前言 dbForge Studioor MySQL是一个在Windows平台被广泛使用的MySQL客户端&#xff0c;它能够使MySQL开发人员和管理人员在一个方便的环境中与他人一起完成创建和执行查询&#xff0c;开发和调试MySQL程序&#xff0c;自动化管理MySQL数据库对象等工作。 一、下载地址 下载链…