我正在使用 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>();
}
修复方法是从中删除 IEnumerableMyInnerList
但显然这阻止了它直接可迭代。有没有类似的偷偷摸摸的属性[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]
可以用吗?
yup:
[ProtoContract(IgnoreListHandling=true)]
public class MyInnerList<T> : IEnumerable<T>
{
[ProtoMember(1)]
private readonly List<T> data = new List<T>();
}
偷偷摸摸就是偷偷摸摸。IgnoreListHandling
有智能感知文档:
如果指定,请勿将此类型视为列表,即使它看起来像一个列表。
另外,由于多次请求像这个,我计划尽快考虑实现对锯齿状数组/列表的支持。该计划基本上是让运行时在序列化程序的想象中使用成员(字段 1)来欺骗包装器,因此您可以使用List<List<T>>
它的工作原理就像上面的模型一样(它甚至是有线兼容的,因为你明智地选择了现场1
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)