我用protobuf-net序列化了一个对象列表。
理论上,.bin文件可以包含数百万个对象。
假设对象属于包含以下内容的类:
public string EventName;
我必须进行查询并创建一个包含与查询匹配的对象的列表。 使用LINQ从序列化文件中提取匹配对象的正确方法是什么?
答案 0 :(得分:5)
protobuf格式是项目的线性序列;任何索引等你只能单独申请。但是,IEnumerable<T>
可用;你可能会发现:
var item = Serializer.DeserializeItems<YourType>(source)
.First(item => item.Id == id);
做得很好;这样:
或多件物品:
var list = Serializer.DeserializeItems<YourType>(source)
.Where(item => item.Foo == foo);
(如果你想缓冲内存中的匹配项,可以在上面添加一个ToList,如果你只想以一个前向方式解析它,可以在没有ToList的情况下使用)
答案 1 :(得分:1)
如果您想在所选元素列表上添加一些投影,您应该尝试使用我的库https://github.com/Scooletz/protobuf-linq。它们也可以在NuGet上使用。 该库大大降低了反序列化的开销。在某些情况下,它可以降至原始查询的50%。
答案 2 :(得分:0)
不幸的是,没有一个。要使用LINQ,您的对象必须实现IQueryable<T>
或IEnumerable<T>
。除非有一个LINQ提供程序可以在.bin文件中提供IQueryable<T>
接口,否则你必须:
IEnumerable<T>
IQueryable<T>
的LINQ提供程序(如果您的文件是巨大的,这可能是唯一可行的选项),可以处理文件而不加载整个文件。答案 3 :(得分:0)
protobuf可以将文件内容作为流媒体IEnumerable<T>
提供给您,因此您可以轻松地执行此操作。不幸的是,我不知道如何调用该方法,但在文档中很容易找到。