我已经阅读了有关继承的各种帖子,并且协议缓冲区不支持继承。我不想继承 Protocol Buffers 消息,而是继承,这样我就可以轻松处理我的所有 Protocol Buffers 消息。
我正在使用 protobuf-net 2.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.?
所有指针表示赞赏。