我在我们的一个项目中使用protobuf-net来序列化/反序列化大量同类对象。它工作得很好,速度也很棒。只是有一个问题。反序列化是否可以使用linq(或任何其他机制)来指定过滤条件,以便加载仅满足该条件的对象?反序列化所有对象然后应用linq过滤器是相当简单的,但我想减少加载到内存中的对象的数量。过滤条件可能是相当动态的,所以字符串类型的机制会很棒(像dlinq?)。
答案 0 :(得分:2)
没有内置任何东西,但是如果你有一个明确定义的用例,我当然可以看到它(我是作者)。
目前,我建议使用以下的一些变体:
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();
(它会再次及时发布不匹配的项目)
要在通用的情况下执行此操作(特别是对于更复杂的查询),我无法想到在不实现对象的情况下执行此操作的理智方式,因此可能> em>尽可能接近,除非有一个非常具体(和简单)的场景,发生与底层数据存储很好地对齐(例如,过滤器总是在“标签1”上)
答案 1 :(得分:1)
通常,在完成反序列化之前,您将无法将序列化数据视为原始数据。 您可以通过过滤获得一些内存优势,但除非这是一个问题,否则不值得打扰。
您可能可以过滤传入的序列化表示,但是要根据您的节省量来衡量执行此操作的时间和精力。
大多数情况下(在桌面或服务器环境中)最好选择有效的简单选项,如果以后需要,可以选择更复杂的选项。