Десериализация объектов Protobuf-Net с использованием фильтра - PullRequest
3 голосов
/ 31 января 2011

Я использую protobuf-net в одном из наших проектов для сериализации / десериализации большого набора однородных объектов. Работает довольно хорошо, а скорость просто фантастическая. Просто есть один вопрос, хотя. Можно ли при десериализации использовать linq (или любой другой механизм) для определения критериев фильтрации, чтобы загружались объекты, которые соответствуют только этим критериям? Довольно просто десериализовать ВСЕ объекты и затем применить фильтр linq, но я хочу уменьшить количество объектов, загружаемых в память. Критерии фильтра могут быть довольно динамичными, поэтому механизм с строковым механизмом будет фантастическим (что-то вроде dlinq?).

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Нет, там нет ничего встроенного, но если у вас есть четко определенный сценарий использования, это то, на что я, конечно, могу взглянуть (я автор).

На данный момент я бы предложил использовать несколько вариантов:

var found = Serializer.DeserializeItems<A>(source, PrefixStyle.Base128,
         Serializer.ListItemTag).FirstOrDefault(obj => obj.Foo = "bar");

if(found != null) {...}

, который закорачивается при обнаружении совпадения и быстро освобождает объекты для сбора (возможно, в gen-0). Или для нескольких предметов, возможно:

var list = Serializer.DeserializeItems<A>(source, PrefixStyle.Base128,
         Serializer.ListItemTag).Where(obj => obj.Foo = "bar").ToList();

(который снова быстро освобождает несоответствующие элементы)

Чтобы сделать это в случае общего (особенно для более сложных запросов), я не могу придумать разумного способа сделать это без материализации объекта, так что это , вероятно, настолько близко, насколько это возможно, если только не существует очень специфического (и простого) сценария, в котором случается для точного выравнивания с основным хранилищем данных (например, фильтр всегда находится на «теге 1»). *

1 голос
/ 31 января 2011

Как правило, вы не сможете обрабатывать ваши сериализованные данные как что-либо, кроме необработанных данных, пока не завершите десериализацию.Вы можете получить некоторые преимущества памяти от фильтрации по ходу работы, но если это не проблема, это не стоило бы беспокоиться.

Возможно, вы сможете фильтровать входящее сериализованное представление, но взвесьте количество времени ипопытайтесь сделать это против того, что вы сэкономите.

Большую часть времени (в среде настольного компьютера или сервера) лучше использовать простой вариант, который работает, а затем перейти к чему-то более сложному, если вам нужно это позже.

...