Protobuf-net:嵌套的IEnumerable对象

时间:2013-05-09 10:05:47

标签: c# protobuf-net

我使用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; }
    }
}

1 个答案:

答案 0 :(得分:8)

  

是否有可以使用[ProtobufCustomObjectSoPleaseIgnoreIEnumerable]的偷偷摸摸的属性?

烨:

[ProtoContract(IgnoreListHandling=true)]
public class MyInnerList<T> : IEnumerable<T>
{
    [ProtoMember(1)]
    private readonly List<T> data = new List<T>();
}
鬼鬼祟祟偷偷摸摸。 IgnoreListHandling有智能感知文档:

  

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

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