2015-05-31 50 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

相關問題