Protobuf-net不序列化泛型类型继承自泛型类型

时间:2014-07-24 09:12:06

标签: c# generics protobuf-net

我有这个模特:

[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-net进行序列化和反序列化:

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,它就是null。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

请参阅protobuf with inheritance?了解详情

答案 1 :(得分:1)

从protobuf-net的角度来看,准备就绪接收开放泛型类型Downstream/upstream-master作为字段2 ...但是,TestRequest<>没有任何东西存在:只有封闭的泛型类型作为实际对象存在,因此TestRequest<>对protobuf-net无用。

在某些情况下的工作原理是:

TestRequest<>

但是,将它与泛型本身混合起来可能不是一个好主意。

我怀疑你想要的是:

[ProtoContract]
[ProtoInclude(2, typeof(TestRequest<Foo>))]
[ProtoInclude(3, typeof(TestRequest<Bar>))]
[ProtoInclude(4, typeof(TestRequest<Blap>))]
然而,我不知道这是否会编译,更不用说如果它是你所追求的。实际上,我的观点是,如果你被束缚到这种结,你可能过度复杂你的序列化模型 - 通常是尝试序列化你的主域模型的结果 - 和也许现在是时候转向更简单,专注的模式了。