【问题标题】:Deserializing Collections with protobuf-net使用 protobuf-net 反序列化集合
【发布时间】:2011-11-27 21:10:56
【问题描述】:

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

在下面的代码示例中,Deserialize (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);
}

Deserialize 在 getCity 中加载以下内容:

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

getCity.streets2: null, null, "streetA", "streetB"

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

【问题讨论】:

    标签: protobuf-net


    【解决方案1】:

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

    这里至少有 3 个修复:

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

    【讨论】:

    • 谢谢! [ProtoContract(SkipConstructor=true)] 和 [ProtoMember(1, OverwriteList = true)] 对于每个集合字段都可以正常工作。再次快乐!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多