Thrift / Proto怎么样?

时间:2012-03-10 17:02:09

标签: c# serialization buffer protocol-buffers thrift

我需要将一个100000的大型对象序列化为一个文件,但在反序列化期间,我想读取每次读取1000个对象的chuck。

目前我没有找到任何关于C#的Thrift或Protocol Buffer的好例子。请有人帮助我。

此致

2 个答案:

答案 0 :(得分:2)

好的protobuf-csharp-port有MessageStreamIteratorMessageStreamWriter,它允许你写出一个序列,然后在反序列化时迭代它们。然后你可以使用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);

另请注意,协议缓冲区是可附加的,因此要向文件中添加更多数据,只需查找文件末尾并开始编写更多数据。