6

Protobuf-net は最速のようで、高性能が必要な場合は、.NET の最も推奨されるシリアル化ライブラリです。何十万ものオブジェクトをネットワーク経由で送信する必要があるため、本当に使いたいと思っています。

しかし、私は始めるのに問題があります。ドキュメント (github の wiki) は、特に v2 の場合、非常にまばらです。

どういうわけか、そこにいる皆さんはlibを使いこなせるようです。どのように?ソースを読んで?試行錯誤?それとも、私が知らない API ドキュメントやチュートリアルがありますか? (GitHib ページしか知りません。)

感謝と歓声、

1月

PS: RuntimeTypeModel (属性のない POCO) を使用する必要があります。

4

3 に答える 3

6

あなたは代替案についても尋ねたので...

属性の装飾が不要であることが、単純な API を使用した高速なシリアライゼーション ライブラリであるMigrantを作成した理由の 1 つです。ライブラリには、protobuf にも存在するいくつかのアイデアがあります (そのため、速度とサイズの点で多かれ少なかれ同等です) が、同時にさまざまな問題を解決しようとします。protobufの特徴としては、空のコレクションとnullコレクションの違いがあり、全体のシリアル化は、参照は参照ベース、値は値ベースです(まあ、参照を特別な種類の値として扱うこともできます)。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

免責事項: 私は開発者の 1 人です。

于 2013-09-16T11:53:02.757 に答える
2

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 と2に関連付けられNameます。属性を使用する場合、非属性 API で実際に公開する必要がある組み込みの「自分で理解する」コードがいくつかあります。次のようなものです。

  • すべてのパブリック フィールドとプロパティをアルファベット順にシリアル化します
  • すべてのフィールド (パブリックまたは非パブリック) をアルファベット順にシリアル化します

ただし、これらはどちらもリフレクションで行うのは非常に簡単です。どちらの場合でも、ある時点で型が変更される可能性がある場合、リフレクションを使用すると問題が発生する可能性があることに注意してください。

役立つ可能性があり、詳細情報を提供できる追加機能:

  • 型ファクトリを (グローバルまたはインスタンスごとに) 指定できます。これは、値を事前に設定したり、利用可能なオブジェクトのプールを使用したりするのに役立ちます。
  • サロゲート型は複雑なシナリオのために書くことができます - これはほとんどのモデルが正常に動作する場合に役立ちますが、1 つの型が難解すぎてシリアライゼーションに適していません - しかし、変換コードを書くことができる別のレイアウトを考案することができます両方向
  • 「タプル」のように見える多くのものは、デフォルトで処理されます。特に、それがパブリックに不変であり、すべてのパブリック メンバーに一致するパラメーターを受け入れるコンストラクターがある場合、指定された順序でメンバーをシリアル化すると想定されます。コンストラクタ
于 2013-09-15T20:28:33.597 に答える