我需要将一个100000的大型对象序列化为一个文件,但在反序列化期间,我想读取每次读取1000个对象的chuck。
目前我没有找到任何关于C#的Thrift或Protocol Buffer的好例子。请有人帮助我。
此致
答案 0 :(得分:2)
好的protobuf-csharp-port有MessageStreamIterator
和MessageStreamWriter
,它允许你写出一个序列,然后在反序列化时迭代它们。然后你可以使用LINQ to Objects获得1000或任何你想要的东西。
答案 1 :(得分:1)
如果你使用protobuf-net,有一个方法DeserializeItems(或类似的)提供一个IEnumerable<T>
实现,非缓冲,允许你根据需要使用项目(适用于LINQ“Take”等) 。如果原始序列化对象是对象的列表/数组,则这非常有效。它还与DeserializeWithLengthPrefix方法完全兼容,该方法从流中读取单个对象而不会过度读取(作为日志,因为它是长度前缀的,如果数组/项列表,就是是序列化的,允许你在“while”循环中做同样的事情。如果您想要更完整的示例,请与我们联系。
示例:
// write
YourType[] array = ...;
Serializer.Serialize(destination, array);
// read
List<YourType> batch = new List<YourType>(1000);
foreach(var item in Serializer.DeserializeItems<YourType>(source)) {
batch.Add(item);
if(batch.Count == 1000) {
ProcessBatch(batch);
batch.Clear();
}
}
if(batch.Count != 0) ProcessBatch(batch);
另请注意,协议缓冲区是可附加的,因此要向文件中添加更多数据,只需查找文件末尾并开始编写更多数据。