2011-11-27 89 views
2

在我从BinaryFormatter切换到protobuf-net的过程中, 在序列化集合时观察到了差异。使用protobuf-net反序列化集合

在下面的代码示例中,反序列化(protobuf网v2r470)返回 不同的结果,如果一个阵列比外面(STREET2)内 类(street1)实例化。

不允许序列化类声明中instatiated的集合吗?

[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?

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

回答

3

它,但问题是,protobuf网假定(由于protobuf的格式concatenatable性质),它应该延长(追加)列表/阵列,以及你的领域,初始值设定在启动它长度为2

至少有3个修补这里:

  • 您可以添加SkipConstructor = true添加到ProtoContract,这将意味着它不运行字段初始
  • 有一个“取代列出ProtoMember的语法,告诉它取代而不是追加(我不记得实际的选项,但它的存在)
  • 你可以添加之前,反序列化回调清除构造和反序列化
+1

感谢的领域! [ProtoContract(SkipConstructor = true)]对每个收集字段都可以正常工作,[ProtoMember(1,OverwriteList = true)]。再次开心! – StefanS