【发布时间】:2012-03-10 17:02:09
【问题描述】:
我需要将一个包含 100000 个对象的大型数组序列化到一个文件中,但是在反序列化过程中,我想每次读取 1000 个对象。
目前我没有找到任何 Thrift 或 C# 协议缓冲区的好例子。请有人帮帮我。
问候
【问题讨论】:
标签: c# serialization buffer protocol-buffers thrift
我需要将一个包含 100000 个对象的大型数组序列化到一个文件中,但是在反序列化过程中,我想每次读取 1000 个对象。
目前我没有找到任何 Thrift 或 C# 协议缓冲区的好例子。请有人帮帮我。
问候
【问题讨论】:
标签: c# serialization buffer protocol-buffers thrift
protobuf-csharp-port 有MessageStreamIterator 和MessageStreamWriter,它们允许您写出一个序列,然后在反序列化时迭代它们。然后你可以使用 LINQ to Objects 得到 1000 或任何你想要的。
【讨论】:
如果您使用 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);
还请注意,协议缓冲区是可附加的,因此要向文件添加更多数据,您只需查找文件末尾并开始写入更多数据。
【讨论】: