我无法弄清楚如何让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 { ... }
答案 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”中我们可以在外部描述模型,如果您想要更多地控制序列化但不影响类型本身。