2010-08-06 55 views
2

我无法弄清楚如何获得protobuf-net来序列化从列表< T>派生的对象。我尝试添加ProtoInclude属性,但收到一个ProtoBuf.ProtoException:ProtoIncludeAttribute的已知类型List`1必须是UserTypeCollection的直接子类。当我删除ProtoInclude attrib时,它显示数据没有被序列化。我似乎无法在任何地方找到这种情况的任何例子。我将protobuf序列化添加为我们的WS API的选项,并且需要保持与DataContractSerializer的兼容性。protobuf-net和从泛型集合派生

[CollectionDataContract(), ProtoContract(InferTagFromName = true)] 
[ProtoInclude(100, typeof(List<UserType>))] 
public class UserTypeCollection : List<UserType> 
{ ... } 

[DataContract(), ProtoContract(InferTagFromName = true)] 
public class UserType { ... } 
+0

什么是您序列化的对象?列表?或一些外部物体? – 2010-08-06 21:43:11

回答

3

ProtoInclude用于表示类型,而不是基本类型(毕竟,基型是已知的)。另外,IList<T>处理应该很大程度上是隐含的;注意,“推断...”等在列表的情况下做得很少,因为列表是只是包含项目的序列。

对于下面,我假设你正在试图序列化列表(作为最顶层的对象):

我不是在此刻正确的机器上,但在释放的dll,我会期望其经对象包装列表会使其工作:

[DataContract] 
public class Foo { 
    private readonly UserTypeCollection items = new UserTypeCollection(); 
    [DataMember(Order=1)] 
    public UserTypeCollection Items {get{return items;}} 
} 

在“V2”我希望,这种情形中,从一开始的工作。我会试着在明天测试(当我有合适的机器时)。

另一个想法;子类化List<T>通常不是很有用,因为这些方法都不是虚拟的。当然,由你决定。最后一点 - 在“v2”中,我们可以从外部描述模型,如果您想对序列化有更多的控制权,但不会影响类型本身。