1

現在、.netバイナリシリアル化を使用して、データをシリアル化して永続化しています。それは仕事をしますが、データの変更はそれほど簡単ではないので、その目的で使用することを意図したようにはなりません。

そこで、protobufはその目的に合わせて設計されているため、調査を開始しました。

私はそれを使用する方法にprotobuf-netを見ています。以下は私がまだ知らないことです。あなたがすでに答えを得たなら、それは私の日を救うでしょう。

  • 製品は.netにあるだけなので、.protoファイルは気にしません。したがって、.protoファイルがなくてもprotobuf-netを使用できますか。
  • はいの場合、他の言語への移植が必要な場合、後でc#クラスから.protoファイルを生成できますか?
4

1 に答える 1

4

はい、protobuf-netは.protoファイルなしで動作します。実際、protobuf-netの場合、コアは.protoサポートよりずっと前に作成されていました。必要なのは、シリアル化するメンバーごとに一意の番号を取得できるようにすることだけです。「v2」(リリースされていない)ではこれを外部で行うことができますが、利用可能なdllではこれは属性を意味します。これ、特注のprotobuf-net属性にすることも、(たとえば)DataContractSerializerより便利な場合は属性を使用することもできます。

[DataContract]
public class Foo {
    [DataMember(Order=1)]
    public int Abc {get;set;}

    [DataMember(Order=2)]
    public string Def {get;set;}
}

.protoファイル()の生成はサポートされています、いくつかの注意点があります。Serializer.GetProto

  • protobuf-netは継承をサポートしています。Googleのprotobuf仕様には継承の定義はありません。相互運用が将来の懸念事項であると思われる場合は、継承を回避するのが最善かもしれません(ただし、それを解釈する方法あります。probofuf-netは常に有効なprotobufストリームを出力します)
  • 他の複雑なタイプは解釈が必要な場合があります。たとえば、whilefloatdoubleprotobufタイプ(すべての実装で使用可能)に直接マップしますが、これはandには当てはまりません。相互運用性が問題であると思われる場合は、最初からこれを単純化する価値があるかもしれません。たとえば、オフセットを表すを代わりにエポックに送信することを決定しますか?どの実装でも簡単に解釈できます。decimalDateTimeDateTimelong
于 2010-07-17T20:59:05.797 に答える