如何使用protobuf-net序列化和反序列化自定义列表

时间:2011-07-11 09:09:54

标签: c# protobuf-net

我有一个自定义List,它带有一些我需要序列化的属性及其包含的项目。

但是,只要我将ProtoContract属性添加到自定义列表中,它的项目就不再被序列化了。

示例:

    [ProtoContract]
    public class MyCollection : List<string> { 

    [ProtoMember(1)]
    public string MyAdditionalField;
   }

这不应该开箱即用吗?

我能想到的唯一可能的解决方法是使用自定义列表的代理项,该列表包含一个单独的列表,该列表随后包含所有数据。但是,我们正在处理大量的自定义列表......所以这将是一种低效的方法。

谢谢你, TH

1 个答案:

答案 0 :(得分:1)

XmlSerializerTypeDescriptor(以及可能DataContractSerializer - 我没有检查过)相同, 列表与之间存在很大差异包含列表。如果某个内容是列表,则它本身没有值。

首选布局是 有一个列表值。

在协议级别,根本无法表示,因为这只是repeated string {name} = {field} - MyAdditionalField根本无处可去。

(更新);经过测试,确实XmlSerializer行为相同:

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="
http://www.w3.org/2001/XMLSchema">
  <string>abc</string>
  <string>def</string>
</ArrayOfString>

DataContractSerializer更讨厌它,扔掉:

  

类型'MyCollection'是一种无效的集合类型,因为它具有DataContractAttribute属性。