[英]protobuf-net documentation or alternatives
Protobuf-net似乎是最快的,並且對於高性能需要最推薦的.NET序列化庫。 我真的很想使用它,因為我需要通過線路發送數十萬個對象。
但是,我開始時遇到了麻煩。 文檔(github上的wiki)非常稀疏,特別是對於v2。
不知怎的,你們那里似乎能夠開始使用lib。 怎么樣? 通過閱讀消息來源? 試錯了? 或者是否有一些我不知道的API文檔/教程? (我只知道GitHib頁面。)
謝謝和歡呼,
一月
PS:我需要使用RuntimeTypeModel(沒有屬性的POCO)。
既然你也問過替代品......
不需要屬性修飾是創建具有簡單API的Migrant ,快速序列化庫的原因之一。 圖書館有一些想法也存在於protobuf中(所以我們或多或少在速度和大小方面都相同),但同時試圖解決不同的問題。 在與protobuf不同的特征中,空集合和空集合之間存在差異,整個序列化是基於引用的參考和基於值的值(嗯,您也可以將引用視為一種特殊的值)。 github上的README應該能夠回答你的大部分問題; 是否需要更詳細的信息,請問。
自定義對象序列化的簡單方案:
var stream = new MyCustomStream();
var myComplexObject = new MyComplexType(complexParameters);
var serializer = new Serializer();
serializer.Serialize(myComplexObject, stream);
stream.Seek(0, SeekOrigin.Begin);
var myDeserializedObject = serializer.Deserialize<MyComplexType>(stream);
請注意, Deserialize
中的預期類型僅用於具有反序列化對象的良好編譯時類型,您也可以使用常規object
。
免責聲明:我是開發人員之一。
在protobuf中,每個類型的成員都需要一個識別號碼,因為protobuf是基於數字的(它不發送名稱)。 因此,訣竅很簡單:告訴它使用什么數字。 例如:
class Customer {
public int Id {get;set;}
public string Name {get;set;}
}
為此指定合同的最簡單方法是:
RuntimeTypeModel.Default.Add(typeof(Customer), false).Add("Id", "Name");
將Id
與1和Name
關聯起來2.當使用屬性時,有一些內置的“自己搞定”代碼,我應該在非屬性API上公開 - 例如:
但是:這兩個都很容易用反射做。 請注意,在任何一種情況下,如果類型可能在某些時候發生變化,使用反射是遇到問題的好方法。
其他可能有用的功能,我可以提供更多信息:
它是一個簡單,快速,輕量級的.NET序列化器和解串器,適用於C#類型,無需任何屬性或其他裝飾。
var stream = new MemoryStream();
// serialise to stream
new Serialiser<Holiday>().Serialise(stream, christmas);
stream.Position = 0;
// deserialise from stream
var christmas = new Deserialiser<Holiday>().Deserialise(stream);
它使用反射發射在運行時生成高度優化的序列化和反序列化功能。 底層編碼是MsgPack,它是自描述的,因此稍微大於線上的protobuf,但它確實意味着您可以解碼您收到的任何消息,包括屬性名稱,類型和值。
免責聲明:我寫了這個庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.