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



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

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

当试图创建DeepClone或进行序列化时,我们会得到以下消息:

系统。NotSupportedException:不支持嵌套或交错的列表、数组和映射:系统集合。通用的列表`1[自定义项.Test.IgnoreListHandlingTest+ListItem]

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

非常感谢你的提示。

一个示例显示了在V2中工作时哪种类型的序列化在V3中失败:示例

应该只是工作;事实上,以下操作很好:

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

如果这没有帮助,我强烈建议更新问题,以显示最小的repo,即可运行的(如上所述(,以演示您所看到的内容。

最新更新