有没有办法在protobuf-net中使用IReadOnlyCollection <t> / IReadOnlyList <t>

时间:2015-05-31 12:49:57

标签: c# .net protobuf-net

我认为在使用集合时,protobuf-net需要GetEnumerator进行序列化,使用Add进行反序列化。

对于没有Add的类型,您可以设置在反序列化之前执行的继承类型。例如,这适用于IEnumerableList

[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

编辑:我已在项目的存储库中为此功能打开了一个问题:Support IReadOnlyCollection/IReadOnlyList members

1 个答案:

答案 0 :(得分:3)

这里的主要问题是“合并”。对于非合并(或基本上:启用列表替换),我们可能会硬编码具体的类型和策略,但是,合并没有明显的事情要做。

目前这种情况没有魔力;任何解决方案都需要更改库。