我认为在使用集合时,protobuf-net需要GetEnumerator
进行序列化,使用Add
进行反序列化。
对于没有Add
的类型,您可以设置在反序列化之前执行的继承类型。例如,这适用于IEnumerable
和List
:
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Sheep
{
public IEnumerable<string> Children { get; set; }
public Sheep()
{
Children = new List<string>();
}
}
var dolly = RuntimeTypeModel.Default.DeepClone(new Sheep
{
Children = new[]
{
"Bonnie",
"Sally",
"Rosie",
"Lucy",
"Darcy",
"Cotton"
}
});
但是,当我对IReadOnlyCollection
(或IReadOnlyList
)执行相同操作时:
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Sheep
{
public IReadOnlyCollection<string> Children { get; set; }
public Sheep()
{
Children = new List<string>();
}
}
我得到一个例外:
无法为System.Collections.Generic.IReadOnlyCollection`1 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]
解析合适的Add方法
那么,有没有办法让protobuf-net处理成员IReadOnlyCollection
/ IReadOnlyList
?
答案 0 :(得分:3)
这里的主要问题是“合并”。对于非合并(或基本上:启用列表替换),我们可能会硬编码具体的类型和策略,但是,合并没有明显的事情要做。
目前这种情况没有魔力;任何解决方案都需要更改库。