3

次のような.protoがあるとします。

message Base {
    string Dummy = 1
}

message Derived {
    Base Super = 1
    string Parp = 2 
}

...そしていくつかのC#のようなもの:

public class Base {
    public string Dummy;
}

public class Derived : Base {
    public string Parp
}

これを実行できるように、protobuf-netでシリアル化をカスタマイズするにはどうすればよいでしょうか。最初はTypeModelの使用とBaseMetaTypeのAddSubTypeの呼び出しを検討し始めましたが、その後、すべての派生クラスのオプションのフィールドを使用してBaseの型定義を作成するようです(つまり、必要なものとは逆になります)

自分で階層をたどることができるかもしれないと思いましたが、TypeModelを見ると、Deserialiseへの型の提供をサポートしているようですが、シリアル化中にvalue.GetType()を使用します。それでも、私がこれをどのように行うかは完全には明確ではありませんでした。ProtoWriterを使用してすべてのフィールドを手動で書き込む唯一のオプションはありますか?これは私が現在試みていることですが、もっと簡単な方法があることを望みました。

4

1 に答える 1

2

最初に注意することは、protobuf自体は継承をサポートしていないということです。このための「公式」レイアウトはありません。Protobuf-netは、希望する方法でシリアル化をサポートしません。サブタイプのカプセル化(ベースタイプのカプセル化ではなく)の選択は、次のようないくつかの問題を修正するために行われました。

  • リスコフの置換原則を満たす
  • シリアル化されたタイプが呼び出し元によって認識されていない/予期されていない場合に正しく機能する
  • 基本的には、まったく機能しません(両端が取得しているサブタイプを正確に事前に知っている最も単純な例以外の場合、これはポリモーフィズムのポイントを大幅に打ち負かします)

ただし、DTOを手動でマップすることもできます。基本的に、DTOレイヤーは継承をまったく使用しません。

于 2012-10-01T14:46:43.463 に答える