2014-07-24 227 views
4

继承我有这种模式:protobuf网不序列化泛型类型的泛型类型

[ProtoContract] 
[ProtoInclude(2, typeof(TestRequest<>))] 
public class XClass<T> 
{ 
    public XClass() 
    { 
    } 

    [ProtoMember(1)] 
    public T Value { get; set; } 
} 

[ProtoContract] 
public class TestRequest<T>: XClass<T> where T : ConcreteClass 
{ 

    public TestRequest() 
    { 
    } 

} 

[ProtoContract] 
public class ConcreteClass 
{ 
    [ProtoMember(1)] 
    public string Name { get; set; } 
} 

如果我尝试序列,并与protobuf网反序列化:

TestRequest<ConcreteClass> request = new TestRequest<ConcreteClass>(); 
request.Value = new ConcreteClass() { Name = "test" }; 
MemoryStream msTestString = new MemoryStream(); 
Serializer.Serialize(msTestString, request); 
msTestString.Position = 0; 
request = Serializer.Deserialize < TestRequest<ConcreteClass>>(msTestString); 

并在此之后如果我检查request.Value,它是空的。

我在做什么错了?

+0

在尝试反序列化之前,msTestString的价值是什么? –

+0

[protobuf继承?]的可能的重复?(http://stackoverflow.com/questions/4746678/protobuf-with-inheritance) –

+0

没有重复。我只有问题,如果泛型类型从另一个泛型继承。 –

回答

1

这是设计与protobuf网。数据如此快速和轻便的原因之一是它不担心类型信息。不幸的是(这取决于你的观点)完全排除了它的继承。

看到protobuf with inheritance?更多信息

1

从protobuf网的角度来看,它是底漆,并准备接收开放式泛型类型TestRequest<>为现场2 ...但是,从来都没有存在的TestRequest<>:只关闭通用类型作为实际对象存在,所以TestRequest<>对protobuf-net无用。

什么会在某些情况下工作:

[ProtoContract] 
[ProtoInclude(2, typeof(TestRequest<Foo>))] 
[ProtoInclude(3, typeof(TestRequest<Bar>))] 
[ProtoInclude(4, typeof(TestRequest<Blap>))] 

但是,它可能不是泛型自己混这是一个好主意。

我怀疑你实际上想要的是:

[ProtoContract] 
[ProtoInclude(2, typeof(TestRequest<T>))] 
public class XClass<T> {} 
然而

,我不知道如果这甚至编译,更不用说如果是你所追求的。实际上,我的观点是,如果你被束缚在这种类型的结中,你可能是可能过分复杂化你的序列化模型 - 通常是试图序列化你的主域模型的结果 - 也许是时候转向更简单,专用的模式。