我有一个继承链,例如:
[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;}
}
继承链非常简单(我的。为了让Headers包含在序列化中,我需要这样做:
RuntimeTypeModel.Default[typeof(Packet)].AddSubType(3, typeof(Message<PayloadType>));
我知道很多StackOverflow帖子都记录了这种答案(上面一行)。但是,我不喜欢这种设计,因为那时我需要提前声明我所有的子类型,这也意味着有限的,少量的子类型。
我正在尝试在我的应用程序中编写消息总线,使用protobuf-net进行序列化/反序列化。消息总线需要发送“事件”并响应请求/回复。由于我的系统中有很多(很容易> 100)事件,所以我不想为RuntimeTypeModel中的每个封闭泛型类型声明一个子类型。
protobuf-net是否有能力推断子类型/类?或者理想情况下,我喜欢这样的东西:
RuntimeTypeModel.Default[typeof(Packet)].AddSubType(3, typeof(Message<>));
(我试过但它不起作用)。
答案 0 :(得分:2)
在protobuf有线格式中,发送的唯一标识符是数字键(如示例中的1,2,3)。在对数据进行序列化之后,您可能希望将来反序列化 - 如果未明确指定密钥,则可靠地执行此操作会导致非常出现问题。特别是因为这些子类型可以在不同的程序集中声明,所以它甚至无法通过反射来推断它们。
目前,简短的回答是“必须指定”。请注意,我没有说“在属性中” - 如果更方便的话,也可以在运行时通过RuntimeTypeModel
API指定子类型。