嵌套的可枚举对象

本文关键字:对象 枚举 嵌套 | 更新日期: 2023-09-27 18:13:02

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

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

下面是一个导致错误的列表结构的例子:

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

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

到目前为止,我想到的最佳替代方案是使用Enumerable属性,如下所示,但我担心该属性仍然可能再次被强制转换回列表。我更愿意以某种方式使用GetEnumerator/yield,但我不知道如何使用。
[ProtoContract]
public class MyInnerList<T>
{
    [ProtoMember(1)]
    private readonly List<T> data = new List<T>();
    public IEnumerable<T> Data
    {
        get { return this.data; }
    }
}

嵌套的可枚举对象

是否有像[ProtobufCustomObjectSoPleaseIgnoreIEnumerable]这样狡猾的属性可以使用?

是的:

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

sneaky就是sneaky。IgnoreListHandling有智能感知文档:

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

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