2011-11-27 103 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