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

相关推荐

  1. C#数组ProtoBuf使用问题

    2024-06-15 15:50:02       29 阅读
  2. skynet 使用protobuf

    2024-06-15 15:50:02       42 阅读
  3. <span style='color:red;'>protobuf</span>

    protobuf

    2024-06-15 15:50:02      55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-15 15:50:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-15 15:50:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-15 15:50:02       87 阅读
  4. Python语言-面向对象

    2024-06-15 15:50:02       96 阅读

热门阅读

  1. js字符串域名把域名前缀剪切掉

    2024-06-15 15:50:02       20 阅读
  2. Html_Css问答集(6)

    2024-06-15 15:50:02       27 阅读
  3. python的random模块三choices和shuffle()

    2024-06-15 15:50:02       28 阅读
  4. 表的删除与更新

    2024-06-15 15:50:02       31 阅读
  5. SQL Auto Increment

    2024-06-15 15:50:02       19 阅读
  6. select简单查询

    2024-06-15 15:50:02       29 阅读
  7. C++ 设计模式

    2024-06-15 15:50:02       33 阅读