1

次のような継承チェーンがあります。

[ProtoContract]
public abstract class Message
{
    [ProtoMember(1, OverwriteList = true)]
    public List<Header> Headers {get; set;}
}

[ProtoContract]
public class EventMessage<T> : Message
{
    [ProtoMember(2)]
    public T Event {get; set;}
}

継承チェーンは非常に簡単です (my .ヘッダーをシリアル化に含めるには、次のことを行う必要があります。

RuntimeTypeModel.Default[typeof(Packet)].AddSubType(3, typeof(Message<PayloadType>));

この種の回答 (上記の行) は、かなりの数の StackOverflow 投稿で文書化されていることを知っています。ただし、この設計は好きではありません。すべてのサブタイプを事前に宣言する必要があり、限られた少数のサブタイプを暗示しているからです。

シリアライゼーション/デシリアライゼーションに protobuf-net を使用して、アプリケーションでメッセージ バスをコーディングしようとしています。メッセージ バスは「イベント」を送信し、要求/応答に応答する必要があります。私のシステムには多くの (簡単に 100 を超える) イベントがあるため、RuntimeTypeModel でクローズされたジェネリック型ごとにサブタイプを宣言したくありません。

protobuf-net にはサブタイプ/クラスを推測する機能がありますか? または理想的には、次のようなものが欲しいです:

RuntimeTypeModel.Default[typeof(Packet)].AddSubType(3, typeof(Message<>));

(私が試しましたが、うまくいきません)。

4

1 に答える 1

2

protobuf ワイヤ形式では、送信される唯一の識別子は数字キーです (例の 1,2,3 など)。そのデータがシリアル化された後、おそらく将来的に逆シリアル化する必要があります-そして、キーが明示的に指定されていない場合、それを確実に行うことは非常に問題があります. 特に、これらのサブタイプは異なるアセンブリで宣言される可能性があるため、リフレクションによってそれらを推測することさえできません。

現時点では、短い答えは「指定する必要があります」です。「属性で」とは言っていないことに注意してくださいRuntimeTypeModel。より便利な場合は、実行時に API を介してサブタイプを指定することもできます。

于 2013-06-18T21:28:38.983 に答える