当前位置: 首页> 健康> 养生 > C#中数组ProtoBuf使用问题

C#中数组ProtoBuf使用问题

时间:2025/7/11 0:18:42来源:https://blog.csdn.net/qq_36790074/article/details/139681113 浏览次数:0次

使用 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#中数组ProtoBuf使用问题

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: