Protobuf-net:嵌套的IEnumerable对象

我使用Protobuf-net来序列化自定义嵌套列表。 我知道原生列表不能直接嵌套,这就是我为内部列表使用容器对象的原因。 但是,我还想使我的容器对象IEnumerable,但这意味着Protobuf-net将它抛出错误:

不支持嵌套或锯齿状列表和数组

以下是导致错误的列表结构示例:

[ProtoContract] public class MyOuterList { [ProtoMember(1)] readonly List<MyInnerList> nestedData = new List<ObjectList>(); } [ProtoContract] public class MyInnerList : IEnumerable { [ProtoMember(1)] private readonly List data = new List(); } 

修复是从MyInnerList删除IEnumerable,但显然会阻止它直接迭代。 是否有可以使用的[ProtobufCustomObjectSoPleaseIgnoreIEnumerable]这样的偷偷摸摸的属性?

到目前为止我提出的最好的替代方法是使用如下所示的Enumerable属性,但我担心该属性仍然可以再次转换回列表。 我更喜欢以某种方式使用GetEnumerator/yield但我看不出如何。

 [ProtoContract] public class MyInnerList { [ProtoMember(1)] private readonly List data = new List(); public IEnumerable Data { get { return this.data; } } } 

是否有可以使用的[ProtobufCustomObjectSoPleaseIgnoreIEnumerable]这样的偷偷摸摸的属性?

对:

 [ProtoContract(IgnoreListHandling=true)] public class MyInnerList : IEnumerable { [ProtoMember(1)] private readonly List data = new List(); } 

偷偷摸摸是偷偷摸摸的。 IgnoreListHandling具有intellisense文档:

如果指定,请不要将此类型视为列表,即使它看起来像一个。

此外,由于像这样的多个请求,我计划在短期内实现对锯齿状数组/列表的支持。 计划是基本上让运行时用序列化器的想象中的成员(字段1)来欺骗包装器,这样你就可以使用List>它就像你上面的模型一样工作(它甚至会电线兼容,因为你明智地选择了字段1 )。