1

以下の例では:

Class1のシリアル化にはClass2のシリアル化のほぼ2倍の時間がかかりますか?または、protobuf-netはClass1のbyte []をすでにシリアル化されたデータとして処理しますか?

疑似例:

[ProtoContract]
class Class1
{
  [ProtoMember(1)]
  public byte[] SerializedData { get; set; }
}

[ProtoContract]
class Class2
{
  [ProtoMember(1)]
  public Class3 NonSerializedData { get; set; }
}

[ProtoContract]
class Class3
{
  [ProtoMember(1)]
  public string Address{ get; set; }

  [ProtoMember(2)]
  public string ZipCode{ get; set; }

  [ProtoMember(2)]
  public string Country{ get; set; }
}

Class3 _c3 = new Class3() { Address = "MyAddress", ZipCode = "90210", Country = "AZ"  }

// Class 1 Serialization
Class1 _c1 = new C1();
_c1.SerializedData = protobuf.Serialize(_c3);

byte[] c1Bytes = protobuf.Serialize(_c1);

// Class 2 Serialization
Class2 _c2 = new Class2();
_c2.NonSerializedData = _c3;

byte[] c2Bytes = protobuf.Serialize(_c2);
4

1 に答える 1

1

または、protobuf-net は Class1 の byte[] を既にシリアル化されたデータとして処理しますか?

Abyte[] 生データとして扱われます (そして、追加の処理なしでストリームに書き込まれます) が、シリアル化するために必要ないくつかの小さな処理 (Class1ヘッダー フィールドの書き込みと一般的なオーバーヘッド) がまだあります。個々のオブジェクトを扱う場合、どちらのアプローチも十分に高速であるため、違いはほとんどありません。ただし、大量の場合、シリアル化Class2が著しく高速になると考える十分な理由があります。単一のシリアル化パイプラインを処理すると、多くのオーバーヘッドが回避されるためです。

Class1 のシリアル化には、Class2 のシリアル化のほぼ 2 倍の時間がかかりますか?

これはプロファイリングするのに最適ですが、典​​型的なデータによって異なります。実際の数を思いつくことができるのはあなただけです。「もう少し」期待したい。これらの両方で、「class3 をシリアライズしてから、その出力で構成される class1 をシリアライズするコスト」と「class1 インスタンスで構成される class3 をシリアライズするコスト」を比較しています。

実際、速度が主な関心事である場合、最適なアプローチは次のようになると思います。

[ProtoContract]
class Class2
{
  [ProtoMember(1, DataFormat = DataFormat.Group)]
  public Class3 NonSerializedData { get; set; }
}

この微妙な調整は、Class3(長さプレフィックスの代わりにターミネータを使用することにより) バッファリングされない転送のみの方法で書き込むことができることを意味します。これがデフォルトではない唯一の理由は、Google が明示的に length-prefix アプローチを好むためです。

于 2012-05-23T13:02:11.603 に答える