2012-03-10 56 views
2

我需要序列化100000对象的大型数组到文件,但在反序列化期间,我想每读取1000个对象的卡盘。节俭/原始如何?

目前我没有找到任何节俭或协议缓冲区的C#任何很好的例子。请有人帮助我。

问候

回答

2

井的protobuf-CSHARP端口有MessageStreamIteratorMessageStreamWriter,让你可以写出一个序列,然后遍历他们为你反序列化。然后你可以使用LINQ to Objects获得1000或任何你想要的。

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); 

还要注意,协议缓冲区是追加的,所以更多的数据添加到您刚才寻求到文件的结束和开始写更多的数据文件。

+0

我们的两个解决方案是否相互兼容,出于兴趣? – 2012-03-10 17:16:08

+0

感谢您的快速响应,如果您能提供完整的示例,这将非常棒。 – tabreaz 2012-03-10 17:19:36

+0

@Jon mine是,每个项目:一个**可选**标签varint,通常为“1”,那么长度为varint,然后是有效载荷。这是兼容的吗? – 2012-03-10 17:29:25