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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值