2011-06-13 27 views
2

遵守以下代碼:如何在protobuf-net中序列化非列表<T>集合?

[ProtoContract] 
public class C 
{ 
    [ProtoMember(1)] 
    public IList<string> Tags { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
    var m = RuntimeTypeModel.Default; 
    m.AutoCompile = true; 
    m.Add(typeof(IList<string>), false).AddSubType(1, typeof(ObservableCollection<int>)); 

    var c = new C { Tags = new ObservableCollection<string> { "hello" } }; 
    using (var ms = new MemoryStream()) 
    { 
     Serializer.Serialize(ms, c); 
     ms.Position = 0; 
     var c2 = Serializer.Deserialize<C>(ms); 
     Debug.Assert(c.Tags.Count == c2.Tags.Count); 
     Debug.Assert(c.Tags.GetType() == c2.Tags.GetType()); 
    } 
    } 
} 

最後斷言失敗,因爲c2.Tags是一個普通的List<T>,而不是ObservableCollection<T>。實際上,AddSubType語句被忽略。

是否可以修復它而不使用代理?

回答

1

列表等被映射到.proto規範的「重複」語法。這直接從父對象嵌入。沒有設施來存儲任何額外的元數據。

該代碼已被調整,以突出顯示,而不是默默地忽略它。

您可以指定要使用的默認具體類型,但僅限於此。

+0

我不想愚弄框架。我只是在學習它的能力。我已經提到過,我試圖移植一個現有的應用程序,它根本不是線路友好的。這隻代表更多的代理部門工作。感謝您的解釋。 – mark 2011-06-13 15:01:44

+0

@Mark我真的很欣賞邊緣情況。你正在測試我,但只能起到積極的作用。 – 2011-06-13 16:01:17