継承に関するさまざまな投稿を読みましたが、ProtocolBuffersは継承をサポートしていません。Protocol Buffersメッセージに継承は必要ありませんが、継承が必要なので、すべてのProtocolBuffersメッセージを簡単に処理できます。
プロトコルを定義するためにprotobuf-net2.0.0.480と.protoファイルを使用しています。いくつかの共通の機能を実行し、簡単に検査できるように、共通の祖先が必要になる場合を除いて、すべてうまく機能します。簡単な例:
私の.protoファイル:
message ProtocolInformation {
enum MessageKinds {
LAYOUT_ADVANCE = 1;
LAYOUT_RENDER = 2;
}
required MessageKinds MessageKind = 1;
required int32 UniqueID = 2;
}
message GFX_Layout_Advance {
required ProtocolInformation ProtocolInfo = 1;
required int32 LayoutHandle = 2;
}
message GFX_Layout_Render {
required ProtocolInformation ProtocolInfo = 1;
required int32 LayoutHandle = 2;
required int32 Stage = 3;
}
これは、最終的にGFX_Layout_Advance、GFX_Layout_Renderのクラスを次のように生成します(GFX_Layout_Advanceの一部のみ)。
[global::System.Serializable, global::ProtoBuf.ProtoContract(Name = @"GFX_Layout_Advance")]
public partial class GFX_Layout_Advance : global::ProtoBuf.IExtensible
{
public GFX_Layout_Advance() { }
private GFX_Protocol.ProtocolInformation _ProtocolInfo;
[global::ProtoBuf.ProtoMember(1, IsRequired = true, Name = @"ProtocolInfo", DataFormat = global::ProtoBuf.DataFormat.Default)]
public GFX_Protocol.ProtocolInformation ProtocolInfo
それは部分的なクラスであり、私が実装したオーバーライド可能なコンストラクターがないように見えたので、次のようになりました。
public partial class GFX_Layout_Advance : GfxProtocolMessageBase
{
public override ProtocolInformation ProtocolInformation()
{
return ProtocolInfo;
}
}
これにより、すべての着信メッセージをGfxProtocolMessageBaseとして扱い、ProtocolInformationのクエリを実行して、適切な子孫にキャストできるようになります。この場合、GFX_Layout_Advanceです。でも.....
- 追加の部分クラスGFX_Layout_Advance()を追加すると、異なるprotobufエンコーディングが発生します。インターフェイスへの唯一の変更はメソッドであるため、これがなぜであるかわかりませんか?
結論は次のとおりです。
- 生成されたすべてのprotobuf-netクラスに共通のベース祖先を紹介したい
- 基本の祖先クラスを使用すると、準備ができるまで実際のメッセージタイプにキャストする必要がないため、処理しているメッセージの種類に関する情報にアクセスできます。
1.&2を達成するにはどうすればよいですか?
すべてのポインタを高く評価しました。