.net - protobuf-net 和从泛型集合派生

标签 .net protocol-buffers protobuf-net

我无法弄清楚如何让 protobuf-net 序列化从 List 派生的对象。我曾尝试添加 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 { ... }

最佳答案

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

关于.net - protobuf-net 和从泛型集合派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3427216/

相关文章:

java - Java VM 与 .NET CLR 的性能基准测试

c# - 为什么代码中的小改动不会影响 exe 文件的大小?

protocol-buffers - 如何使用 protobuf 3 支持补丁休息请求

c# - ProtoBuf-net 中的 [ProtoIninclude(20 ,typeof(child))] 如何向上扩展类层次结构树?

c# - 检查 StreamReader 是否可以读取另一行

c# - MSMQ + C#,接收带有编码 byte[] 正文的消息在 Windows 7 和 Windows XP 上的行为不同

java - 损坏的 Protocol Buffer 消息

protocol-buffers - 减少 protobuf 消息大小的最佳实践?

c# - 发送大量 Protobuf 消息时 NetworkStream 关​​闭

c# - RuntimeTypeModel.Add方法中的 "applyDefaultBehaviour"有什么作用?