我们尝试将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
答案 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 (如上)。