gpt4 book ai didi

c# - Protobuf 网络 : Nested IEnumerable objects

转载 作者:太空狗 更新时间:2023-10-29 20:17:20 25 4
gpt4 key购买 nike

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

Nested or jagged lists and arrays are not supported

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

[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; }
}
}

最佳答案

Is there a sneaky attribute like [ProtobufCustomObjectSoPleaseIgnoreIEnumerable] that could be used?

是的:

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

偷偷摸摸的就是偷偷摸摸的。 IgnoreListHandling有智能感知文档:

If specified, do NOT treat this type as a list, even if it looks like one.

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

关于c# - Protobuf 网络 : Nested IEnumerable objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16459227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com