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;}
}

继承链非常简单(我的。为了让 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<>));

(我试过但它不起作用)。

4

1 回答 1

2

在 protobuf 有线格式中,发送的唯一标识符是数字键(如示例中的 1、2、3)。在该数据被序列化之后,您可能希望它在将来反序列化 - 如果没有明确指定密钥,那么可靠地这样做是非常有问题的。特别是因为这些子类型可以在不同的程序集中声明,所以它甚至不能通过反射来推断它们。

目前,简短的回答是“必须指定它们”。请注意,我没有说“在属性中”——RuntimeTypeModel如果这样更方便的话,也可以在运行时通过 API 指定子类型。

于 2013-06-18T21:28:38.983 回答