DeepClone /使用protobuf-net V3序列化列表<item>

时间:2020-09-02 10:51:06

标签: protobuf-net

我们尝试将protobuf-net从V2升级到V3,并遇到一个问题,希望您能为我们指明正确的方向。 我们有一个包含元素列表的类:

[ProtoContract]
public class ClassToSerialize
{
    [ProtoMember(1)] public List<ListItem> List { get; set; } = new List<ListItem>();
}

当尝试创建DeepClone或进行序列化时,我们收到消息:

System.NotSupportedException:不支持嵌套或锯齿状的列表,数组和映射: System.Collections.Generic.List`1 [customizations.Test.IgnoreListHandlingTest + ListItem]

这在V2中有效,但在V3中无效。有什么方法可以序列化这种类型的类并恢复V2行为吗?

非常感谢您的提示。

可以在下面找到一个示例,该示例显示在V3中工作时在V3中哪种类型的序列化失败:Example

1 个答案:

答案 0 :(得分:0)

应该可以正常工作;确实,以下工作正常:

using ProtoBuf;
using System.Collections.Generic;
using System.Linq;

static class P
{
    static void Main()
    {
        var obj = new ClassToSerialize { List = { new ListItem { Id = 42 } } };
        var clone = Serializer.DeepClone(obj);
        System.Console.WriteLine(clone.List.Single().Id); // 42
    }
}

[ProtoContract]
public class ClassToSerialize
{
    [ProtoMember(1)] public List<ListItem> List { get; set; } = new List<ListItem>();
}

[ProtoContract]
public class ListItem
{
    [ProtoMember(1)]
    public int Id { get; set; }
}

所以我只能得出结论,您的ListItem类型存在一些异常(问题中未显示ListItem类型)。尽管我可能预期会导致v2发出完全相同的错误消息进行投诉,但它很可能看起来像“列表式”。如果v2某种程度上忽略了某种类型的兴高采烈,那么您可以通过以下方法进一步说服v3:

[ProtoContract(IgnoreListHandling = true)]
public class ListItem // not shown - some list-like-APIs here
{
    [ProtoMember(1)]
    public int Id { get; set; }
}

如果这没有帮助,我强烈建议您更新问题以显示最小的重复性,即可以显示您所看到内容的 runnable (如上)。