使用protobuf-net进行序列化/反序列化期间遗失的通用类型信息

时间:2017-02-05 10:27:54

标签: protobuf-net mediatr

我正在尝试整合protobuf-net和mediatR。 这个想法是有一个有效载荷到达的端点。 然后,我应该反序列化请求消息并将其交给mediatR,而mediatR又应根据请求消息类型解析为适当的Handler。

每个请求都继承自IRequest。 有一个Result Base Class和很多从它继承的Concrete类。 像:

[ProtoContract]
[ProtoInclude(10, typeof(CreateUserRequest))]
[ProtoInclude(11, typeof(DeleteUserRequest))]
[ProtoInclude(12, typeof(GetUserRequest))]
[ProtoInclude(13, typeof(UpdateUserRequest))]
[ProtoInclude(14, typeof(IRequest))]


[ProtoInclude(19, typeof(IRequest<Response>))]
[ProtoInclude(20, typeof(IRequest<CreateUserResponse>))]
[ProtoInclude(21, typeof(IRequest<DeleteUserResponse>))]
[ProtoInclude(22, typeof(IRequest<GetUserResponse>))]
[ProtoInclude(23, typeof(IRequest<UpdateUserResponse>))]
public class Request : IRequest<Response>
{
    [ProtoMember(1)]
    public Guid CorrelationId { get; set; }

    [ProtoMember(2)]
    public string Requestor { get; set; }
}


 [ProtoContract]
 public class CreateUserRequest : Request, IRequest<CreateUserResponse>
 {
    [ProtoMember(1)]
    public string UserName { get; set; }
 }


 public class CreateUserResponse : Response
 {
     [ProtoMember(1)]
     public string NewUserName { get; set; }
 }

问题是,当我使用protobuf序列化对象时,通用信息会丢失。 我正在一个地方进行反序列化(尝试使用反射等)。 我无法反序列化为IRequest类型的对象。

有没有办法保存有关泛型参数的信息,以便我可以将我的对象反序列化为IRequest类型,而不仅仅是CreateUserRequest?

当然,希望我做错了什么?

1 个答案:

答案 0 :(得分:0)

“include”功能旨在用于类,而不是接口。您所描述的内容不是受支持的方案,因为它不提供可靠的可重复反序列化选项。基本上,它试图做的是让你解决具体类型;接口并没有真正帮助你做到这一点 - 更糟糕的是,它们使它更加混乱,因为单一类型(模型中没有提到)可以实现所有这些接口 - 这实际上并没有给出这很有可能。

但是,没有丢失一般信息;通过了解您的类型沿着CreateUserRequest路径向下,我们已经知道实现了哪些接口 - 它们直接绑定到类型定义中。

我仍然对你要做的事情感到有点困惑,但是:在确定序列化路径时,代码不会查看接口。