2

我无法弄清楚如何让 protobuf-net 序列化从 List<T> 派生的对象。我尝试添加 ProtoInclude 属性,但收到ProtoBuf.ProtoException :ProtoIncludeAttribute 的已知类型列表`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 { ... }
4

1 回答 1

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”中,如果您想对序列化有更多控制但不影响类型本身,我们可以在外部描述模型。

于 2010-08-06T21:52:11.773 回答