Заставить protobuf-net игнорировать интерфейсы IEnumerable / ICollection - PullRequest
6 голосов
/ 03 декабря 2011

Как я могу получить v2 protobuf-net, чтобы игнорировать тот факт, что мой класс реализует ICollection, IEnumerable и т. Д.?

Для этого конкретного сценария я хочу, чтобы только поля, помеченные как [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; }
    }
}

Класс FileTree был написан для объединения путей к файлам, таких как "C: \ happy.txt", "C: \ history.txt", во что-то более похожее на

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

Структура устраняет избыточность в строках пути.Поэтому я действительно не хочу, чтобы класс FileTree сериализовывался с помощью функций IEnumerable, потому что тогда он просто сохраняется как «C: \ happy.txt», «C: \ history.txt» и т. Д. Прямо сейчас, в сериализации.объекта FileTree, каждый путь печатается полностью.


РЕДАКТИРОВАТЬ: Последнее, что я должен упомянуть - у меня есть функция On_Deserialization в FileTree, которая помечена как[ProtoAfterDeserialization].Я поставил точку останова в функции, но она не получила удар.Это связано с тем, как этот класс сериализуется?

1 Ответ

8 голосов
/ 03 декабря 2011
[ProtoContract(IgnoreListHandling = true)]
public class FileTree : ICollection<FilePath> ...
{ ... }

должен это сделать. Я, честно говоря, не думаю, что рассматривал обратные вызовы в списках, так как они обрабатываются настолько сильно, что они не работают, но с учетом вышесказанного это должно работать. Дайте мне знать, если это не так.

Из документации по intellisense:

Получает или задает значение, указывающее, что этот тип НЕ должен рассматриваться как список, даже если он имеет знакомые характеристики, подобные списку (перечислимый, сложить и т. Д.)

...