2015-05-31 53 views
4

我收集的方式,与集合protobuf网需求GetEnumerator系列化与Add对反序列化类型工作时。是否有使用IReadOnlyCollection <T>/IReadOnlyList <T>与protobuf网

对于没有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程序,版本= 4.0.0.0,文化=中性公钥= b77a5c561934e089]]

因此,一个合适的添加方法,有没有办法使protobuf网手柄成员IReadOnlyCollection/IReadOnlyList


编辑:我已经开了一个问题,这个功能对项目的资源库:Support IReadOnlyCollection/IReadOnlyList members

+0

您正在使用哪个protobuf库?一个由marc? –

+0

@YuvalItzchakov是的,protobuf网。 Skeet's是\t protobuf-csharp-port。 – i3arnon

回答

3

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

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

+0

“合并”是否意味着添加到现有集合?如果是这样,那么它与IEnumerable的问题是不一样的,当你在反序列化之前设置一个'List'的时候它会工作吗? – i3arnon

+0

@ i3arnon这就是为什么它需要一个Add方法;在这种情况下,它只是调用添加 - 这里不是一个选项 –

+0

对不起,但我没有得到这两种情况之间的区别,因为在'List'中都执行了'Add'。 – i3arnon

相关问题