protobuf-net - 使用 protobuf-net 反序列化集合

标签 protobuf-net

在我从 BinaryFormatter 切换到 protobuf-net 期间, 我在序列化集合时观察到了差异。

在下面的代码示例中,反序列化 (protobuf-net v2r470) 返回 如果在其中实例化数组,则会产生不同的结果 类(street1)比外部(street2)。

是否不允许序列化在类声明中实例化的集合?

[ProtoContract]
public class City
{
    [ProtoMember(1)]
    public string[] streets1;

    [ProtoMember(2)]
    public string[] streets2 = new string[2];
}

City city = new City();

// Instantiate and populate streets1
city.streets1 = new string[2];
city.streets1[0] = "streetA";
city.streets1[1] = "streetB";

// Populate streets2. Already instantiated
city.streets2[0] = "streetA";
city.streets2[1] = "streetB";

// Serializing
using (var file = File.Create("city.bin"))
{
    Serializer.Serialize(file, city);
}

// Deserializing
using (var file = File.OpenRead("city.bin"))
{
    City  getCity = Serializer.Deserialize<City>(file);
}

反序列化在 getCity 中加载以下内容:

getCity.streets1:“streetA”,“streetB”(如预期)

getCity.streets2: null, null, "streetA", "streetB"<------------ 为什么是 null ?

返回的 null 值与集合中的项目数一样多。

最佳答案

确实如此,但问题是 protobuf-net 假设(由于 protobuf 格式的可串联性质)它应该扩展(附加到)列表/数组,以及您的字段初始化程序从长度 2 开始。

这里至少有 3 个修复:

  • 您可以将 SkipConstructor=true 添加到 ProtoContract,这意味着它不会运行字段初始值设定项
  • ProtoMember 上有一个“替换列表”语法,它告诉它替换而不是追加(我不记得实际的选项,但它就在那里)
  • 您可以添加反序列化之前的回调来清除构造函数和反序列化之间的字段

关于protobuf-net - 使用 protobuf-net 反序列化集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8285566/

相关文章:

c# - 在 protobuf-net 中,是否可以部分反序列化基于基本类型的消息

asp.net-core - protobuf-net.grpc 客户端和 .NET Core 的 gRPC 客户端工厂集成

protocol-buffers - 减少 protobuf 消息大小的最佳实践?

c# - 序列化包含大字节数组的对象列表时抛出 OutOfMemoryException

c# - 使用 WCF 通过 HTTP GET Protocol Buffer

c# - WP7 中的 Protobuf-net 抛出 FieldAccessExceptions

protobuf-net - 如何为我的 protobuf-net 类获取基类

c# - protobuf-net AddField 忽略 IgnoreListHandling

c# - protobuf-net 和重复字段

带有 AoT 编译器和对象池的 Protobuf-net