我正在尝试整合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?
当然,希望我做错了什么?
答案 0 :(得分:0)
“include”功能旨在用于类,而不是接口。您所描述的内容不是受支持的方案,因为它不提供可靠的可重复反序列化选项。基本上,它试图做的是让你解决具体类型;接口并没有真正帮助你做到这一点 - 更糟糕的是,它们使它更加混乱,因为单一类型(模型中没有提到)可以实现所有这些接口 - 这实际上并没有给出这很有可能。
但是,没有丢失一般信息;通过了解您的类型沿着CreateUserRequest
路径向下,我们已经知道实现了哪些接口 - 它们直接绑定到类型定义中。
我仍然对你要做的事情感到有点困惑,但是:在确定序列化路径时,代码不会查看接口。