gpt4 book ai didi

c# - protobuf-net 从磁盘流对象

转载 作者:行者123 更新时间:2023-12-03 23:49:30 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

在 protobuf 中,根对象默认不会终止,目的是允许“合并”===“追加”。这与您所描述的非常常见的情况相冲突。幸运的是,出于这个原因,许多库提供了一种机制来对对象之前的长度进行编码。您正在寻找的是 SerializeWithLengthPrefixDeserializeWithLengthPrefix方法。

如果数据已经以平面追加的形式存在,并且无法重写:仍然有方法可以通过使用读取器 API 来恢复它。有点复杂,但我过去曾在需要时为人们恢复过此类数据。

关于c# - protobuf-net 从磁盘流对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59923277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com