使用protobuf-net反序列化集合

时间:2011-11-27 12:32:59

标签: protobuf-net

在从BinaryFormatter切换到protobuf-net期间, 我在序列化集合时发现了不同之处。

在下面的代码示例中,Deserialize(protobuf-net v2r470)返回 如果在其中实例化数组,则会产生不同的结果 班级(街道1)比班级(街道2)。

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

[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:&#34; streetA&#34;,&#34; streetB&#34; (正如预期的那样)

getCity.streets2:null,null,&#34; streetA&#34;,&#34; streetB&#34; &lt; ---------为什么空的?

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

1 个答案:

答案 0 :(得分:3)

确实如此,但问题是protobuf-net假设(由于protobuf格式的可连接特性)它应该扩展(追加)列表/数组,以及你的字段初始化程序是从2开始。

此处至少有3个修复程序:

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