2014-04-11 69 views
1

我有一個簡單的類象如何序列化/反序列名單<MyClass>使用protobuf網C#

public class Customer{ 
public long Id; 
public string Name; 
.... 
} 

我有一個名單,我想使用protobuf網連載了。請指導我簡單高效地對此進行序列化和反序列化。

EDIT-1 我對着可用與protobuf網的源代碼的單元測試,它使用2種方式進行序列化,採用反射,並用模型(其在內部處理根據的ToString的映射)。

我從源代碼遵循什麼是我使用了相同的技術,在源代碼中的項目文件夾中的e-ProtoBufNetWithModel測試,並創造了TypeModel ...

public static TypeModel CreateModel() 
    { 
     RuntimeTypeModel model = TypeModel.Create(); 

     model.Add(typeof(Customer), false) 
     .Add(1, "Id") 
     .Add(1, "Name"); 

     TypeModel compiled = model.Compile(); 

     return compiled; 
    } 

問題區域

public static Stream SerializeUsingProtobuf(IList<Customer> pSource) 
    { 
     var model = CreateModel(); 
     using (Stream memoryStream = new MemoryStream()) 
     { 
      model.Serialize(memoryStream, pSource); 
      return memoryStream; 
     } 

    } 

TypeModel compiled = model.Compile();,它會引發異常 重複場數來檢測; 1

+0

嘿asif,請先閱讀[你有什麼試用/](http://mattgemmell.com/what-have-you-tried/) – JPVenson

+0

https://code.google.com/p/ protobuf-net/ –

回答

1

要序列化的每個字段都需要不同的標記(正整數)。調用Add時,不要使用1和1,而要使用1和2。或者更簡單,只需添加(「Id」,「Name」);

1

https://code.google.com/p/protobuf-net/

短版 (見舊版首頁)

序列化是一種痛苦。 protobuf-net被設計爲可以輕鬆用於現有代碼,只需進行最少的更改(來自可選的.proto模式),從而在各種.NET平臺上實現快速和可移植的二進制序列化。

它不是「正好在.NET上的協議緩衝區實現」,而是一個「恰好使用協議緩衝區的.NET序列化程序」 - 重點在於讓.NET用戶熟悉(例如,如果你願意,可以在可變的,代碼優先的類上工作)。除了常規的protobuf設計之外,我還添加了一系列常用功能,以幫助滿足.NET程序員的日常需求(繼承,參考跟蹤等)。

用法很簡單;在最基本的層面上,只需從流中讀取或寫入流;請參閱使用入門:

// write to a file 
Serializer.Serialize(outputStream, person); 

... 

// read from a file 
var person = Serializer.Deserialize<Person>(inputStream); 

哦,它非常快;無論是在CPU和帶寬。

如果你想在Visual Studio中使用.proto文件來處理一些VS工具,但你並不需要 - 你可以寫一個類,告訴序列化程序如何使用它(最常見的方法是添加一些屬性,但這取決於你),然後序列化。

https://code.google.com/p/protobuf-net/wiki/GettingStarted

序列化數據 由於「協議緩衝區」是二進制格式,protobuf網在很大程度上基於周圍Stream類;這使得簡單地使用各種各樣的實現成爲可能。例如,要寫入文件:

變種人=新的Person { 標識= 12345,NAME = 「弗雷德」, 地址=新地址{ 線路1 = 「平1」, 2號線=「草甸「 } };使用(var file = File.Create(「person.bin」)){ Serializer.Serialize(file,person); }

這會將32字節文件寫入「person.bin」。它可能不是在上面明顯,但序列化是一種通用的方法 - 行也可能是:

using (var file = File.Create("person.bin")) { 
     Serializer.Serialize<Person>(file, person); 
    } 

但大多數的我們可以讓編譯器的通用類型推斷的時候做的工作我們。

反序列化數據 我們還需要退出數據!

Person newPerson; 
    using (var file = File.OpenRead("person.bin")) { 
     newPerson = Serializer.Deserialize<Person>(file); 
    } 

這會從「person.bin」中讀回數據。注意我們需要告訴它這次的類型(the),否則代碼非常相似。

+0

不,複製和粘貼並不是一個真正的答案 –

+0

@MarcGravell是的,如果它符合他的需求就是一個答案。 ;)無論如何,我會加給你+1 –

+0

以及代表stackoverflow我會說「不,這使我們處於一個尷尬的版權條款」。作爲這種情況下的版權所有者,我不太可能發佈刪除通知 - 但是:如果您沒有增加任何價值,則應該由於這兩個原因而優先選擇鏈接。 –

相關問題