簡體   English   中英

protobuf-net文檔或替代方案

[英]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上公開 - 例如:

  • 按字母順序序列化所有公共字段+屬性
  • 按字母順序序列化所有字段(公共或非公共字段)

但是:這兩個都很容易用反射做。 請注意,在任何一種情況下,如果類型可能在某些時候發生變化,使用反射是遇到問題的好方法。

其他可能有用的功能,我可以提供更多信息:

  • 可以指定類型工廠(全局或每個實例),這對於預填充值或使用可用對象池非常有用
  • 可以為復雜場景編寫代理類型 - 這在大多數模型工作正常時非常有用,但是一種類型太深奧以至於不適合序列化 - 但可以設計一種替代布局,您可以在其中編寫轉換代碼兩個方向
  • 許多看起來像“元組”的東西默認是句柄 - 特別是,如果它是公共不可變的,並且有一個接受與所有公共成員匹配的參數的構造函數 - 它將假定按照指定的順序序列化成員。構造函數

另一種選擇是Dasher (可通過NuGet獲得 )。

它是一個簡單,快速,輕量級的.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM