8

我正在使用 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>();
}

解决方法是从 IEnumerable 中删除,MyInnerList但显然这会阻止它直接可迭代。[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; }
    }
}
4

1 回答 1

8

[ProtobufCustomObjectSoPleaseIgnoreIEnumerable]有没有可以使用这样的鬼鬼祟祟的属性?

对:

[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)。

于 2013-05-09T10:09:02.570 回答