来自磁盘的protobuf-net流对象

问题描述 投票:1回答:1

考虑一下,我有大量(数百万个)根据原型导线格式序列化的对象。是否可以从文件中流式传输这些项目?我尝试将对象序列化为List<T>,然后反序列化单个T项,但最终只能从流中读取最后一项。我还尝试了将每个实例分别序列化到流中,从而具有与反序列化相同的效果,它只读取最后一项。

我怀疑解决方案要求我知道每个序列化项目的大小,然后从流中读取该大小并将该字节范围传递给protobuf序列化程序以进行反序列化。我想确保没有一种简单的机制可以完成此任务,该机制不需要了解每个单独项目的长度(对于对象的每个实例可能有所不同)。

另一个想法是,我将每个即将到来的对象的大小作为自己在流中的对象,例如:

0:第一个对象的元信息,包括字节的类型/长度1:在0中定义的对象2:第二个对象的元信息,包括字节的类型/长度3:在2中定义的对象4:...等

版本信息:我目前正在使用dotnet core 3.1和protobuf-net版本2.4.4

考虑到我有大量(数百万个)根据原型导线格式序列化的对象。是否可以从文件中流式传输这些项目?我尝试将对象序列化为...

c# protocol-buffers protobuf-net
1个回答
0
投票

在protobuf中,默认情况下不会终止根对象,其目的是允许“ merge” ===“ append”。这与您描述的非常普遍的情况相冲突。幸运的是,由于这个原因,许多库提供了一种在对象之前编码长度的机制。您正在寻找的是SerializeWithLengthPrefixDeserializeWithLengthPrefix方法。

© www.soinside.com 2019 - 2024. All rights reserved.