嵌套的可枚举对象
本文关键字:对象 枚举 嵌套 | 更新日期: 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]
这样狡猾的属性可以使用?
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
)。