2017-02-05 79 views
2

我正在嘗試集成protobuf-net和mediatR。 這個想法是有一個單一的端點,有效載荷將到達。 然後,我應該反序列化請求消息並將其交給mediatR,然後應該根據Request消息類型轉而解析爲適當的Handler。使用protobuf-net進行序列化/反序列化時丟失的泛型類型信息

每個請求都從IRequest繼承。 有一個Result Base類和很多從它繼承的具體類。 像:

[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

「包含」功能旨在用於類而不是接口。您所描述的並不是受支持的方案,因爲它不提供可靠的可重複反序列化選項。基本上,它試圖做的是讓你解決具體的類型;接口並不能真正幫助你做到這一點 - 更糟糕的是,它們讓它變得更加令人困惑,因爲單一類型(在你的模型中沒有提到的任何地方)可以實現這些接口的全部--這並沒有給它太多機會。

但是,沒有通用信息丟失;通過知道您的類型沿着CreateUserRequest的路徑,我們已經知道實現了哪些接口 - 它們直接與類型定義相關聯。

對於你想要做什麼,我仍然有點困惑,但是:在確定序列化路徑時,代碼沒有查看接口。

相關問題