2011-12-02 100 views
6

如何讓protobuf-net的v2忽略我的類實現ICollection,IEnumerable等事實?強制protobuf-net忽略IEnumerable/ICollection接口

對於這個特定場景,我只希望標記爲[ProtoMember]的字段被序列化。


我目前正在使用protobuf-net v1轉換爲使用v2。我有一個特殊的結構,現在由於更改而錯誤地序列化。它看起來像下面這樣:

[ProtoContract] 
public class FileTree : ICollection<FilePath>, IEnumerable<FilePath>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged { 

    private FileTreeNode _Root; 

    [ProtoMember (1)] 
    public FileTreeNode Root { 
     get { return _Root; } 
     set { _Root = value; } 
    } 
} 

的文件樹類寫倒塌像文件路徑 「C:\ happy.txt」 「C:\ history.txt」 到更多的東西一樣

"C:\h" 
└─── "appy.txt" 
└─── "istory.txt" 

該結構消除了路徑字符串中的冗餘。所以,我真的不希望FileTree類通過IEnumerable函數被序列化,因爲那麼它只會被存儲爲「C:\ happy.txt」,「C:\ history.txt」等等。現在,在序列化FileTree對象的每個路徑都將全部打印出來。


編輯:最後一件事我應該提到 - 我在文件樹的On_Deserialization功能被標記爲[ProtoAfterDeserialization。我在該函數中放置了一個斷點,但它沒有被擊中。這與這個類被序列化的方式有關嗎?

+0

我不知道*這是v1和v2之間的突破性變化;也許細微的差別在於v1更多地考慮了'IList ',或者'IEnumerable '**與**公共'Add'的組合。 –

回答

7
[ProtoContract(IgnoreListHandling = true)] 
public class FileTree : ICollection<FilePath> ... 
{ ... } 

應該這樣做。我真的不認爲我已經考慮過列表中的回調函數,因爲它們的處理方式與實體非常不同,但上述方法應該可行。讓我知道如果它不。

從智能感知文檔:

設置或獲取表明這種類型的不應該被視爲一個列表,即使它有熟悉的列表類似的特徵值(枚舉,添加等)

+0

謝謝!回想起來,回答如此明顯時,很抱歉打擾你。我正在尋找所有錯誤的地方尋找答案。 – Amanduh

+0

@Amanduh然而,當你知道答案時,大部分事情都是顯而易見的 - 這是一個很好且有效的問題,幸運的是它有一個方便的答案(它直到最近才發佈) –

+0

@MarcGravell請注意,IgnoreListHandling選項(https://code.google.com/p/protobuf-net/issues/detail?id=287&q=IgnoreListHandling)[場景](https://code.google。)可能無法按預期工作。 COM/p/protobuf網/問題/細節?ID = 348&q = IgnoreListHandling)。 – tm1