如何使用protobuf-net序列化/反序列化嵌套/交错数组?

4
在他回答的“哪些情况下protobuf-net不适用?”问题时,马克提到:

没有中间类型的嵌套列表/分叉数组不行-您可以通过引入中间类型来弥补此问题

我希望这意味着有一种方法可以在不改变底层代码的情况下完成它,也许使用代理?有人找到了序列化/反序列化嵌套/分叉数组的好方法吗?

2个回答

9

目前来看,这需要(如消息所示)对您的模型进行更改。然而,原则上,这是库可以完全在其自己的想象中完成的事情 - 那只是我还没有编写/测试的代码。因此,这取决于您需要多快...我可以查看它,但我不能保证任何特定的时间范围。


1
谢谢,这是我目前正在开发的一个项目。我需要调查更改我正在序列化的结构的影响。如果protobuf-net支持2D / jagged数组将会很好,但现在我应该能够解决它。 - David Hayes
3
是的,在这里也绝对需要 :) - vexe

1

一个解决方法是将中间类型序列化,并使用getter/setter将其从代码的其余部分隐藏起来。 例如:

    List<double[]> _nestedArray ; // The nested array I would like to serialize.

    [ProtoMember(1)] 
    private List<ProtobufArray<double>> _nestedArrayForProtoBuf // Never used elsewhere
    {
        get 
        {
            if (_nestedArray == null)  //  ( _nestedArray == null || _nestedArray.Count == 0 )  if the default constructor instanciate it
                return null;
            return _nestedArray.Select(p => new ProtobufArray<double>(p)).ToList();
        }
        set 
        {
            _nestedArray = value.Select(p => p.MyArray).ToList();
        }
    }



[ProtoContract]
public class ProtobufArray<T>   // The intermediate type
{
    [ProtoMember(1)]
    public T[] MyArray;

    public ProtobufArray()
    { }
    public ProtobufArray(T[] array)
    {
        MyArray = array;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接