2

我正在尝试集成 protobuf-net 和 mediatR。这个想法是有一个有效负载将到达的端点。然后我应该反序列化请求消息并将其交给 mediatR,然后它应该根据请求消息类型解析到适当的处理程序。

每个请求都继承自 IRequest。有一个结果基类和许多从它继承的具体类。喜欢:

[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 ?

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

4

1 回答 1

0

“包含”功能旨在与类一起使用,而不是与接口一起使用。您所描述的不是受支持的方案,因为它不提供可靠的可重复反序列化选项。基本上,它试图做的是让您解析具体类型;接口并不能真正帮助您做到这一点 - 更糟糕的是,它们使它更加混乱,因为单一类型(在您的模型中的任何地方都没有提到)可以实现所有这些接口 - 这并没有真正给它太多机会。

但是,一般信息不会丢失;通过知道你的类型沿着CreateUserRequest路径走下去,我们已经知道实现了哪些接口——它们直接绑定到类型定义中。

我仍然对您要执行的操作感到有些困惑,但是:确定序列化路径时,代码不会查看接口。

于 2017-02-05T10:43:53.543 回答