protobuf-net和派生自通用集合

时间:2010-08-06 19:46:29

标签: .net protocol-buffers protobuf-net

我无法弄清楚如何让protobuf-net序列化一个派生自List< T>。我尝试添加ProtoInclude属性,但收到 ProtoBuf.ProtoException:ProtoIncludeAttribute的已知类型List`1必须是UserTypeCollection的直接子类。当我删除ProtoInclude属性时,似乎数据根本没有被序列化。我似乎无法在任何地方找到任何这种情况的例子。我正在添加protobuf序列化作为我们的WS api的选项,并且需要保持与DataContractSerializer的兼容性。

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

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

1 个答案:

答案 0 :(得分:3)

ProtoInclude用于表示 sub 类型,而不是基类型(毕竟,基本类型已知)。此外,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”中我们可以在外部描述模型,如果您想要更多地控制序列化但不影响类型本身。