考虑到我有非常大的对象集合(数百万个),这些对象是根据协议缠绕格式序列化的。 是否可以从文件流式传输这些项? 我尝试将对象序列化为
我怀疑解决方案需要我知道每个序列化项的大小,然后从流中读取该大小,并将那段字节传递给protobuf解析器进行反序列化。 我想确保没有更容易的机制,不需要了解每个单独项目的长度(可能对于对象的每个实例都不同)来完成此任务。
我想到的另一个想法是将每个即将到来的对象的大小作为它自己在流中的一个对象包含在内,例如:
0: 第一个对象的元数据信息,包括类型/字节长度 1: 在0中定义的对象 2: 第二个对象的元数据信息,包括类型/字节长度 3: 在2中定义的对象 4: ...等等
版本信息: 我目前使用的是dotnet core 3.1和protobuf-net版本2.4.4
List<T>
,然后反序列化单个 T
项,但最终只读取了流中的最后一项。 我还尝试了将每个实例单独序列化到流中,具有相同的效果,即在反序列化时仅读取最后一项。我怀疑解决方案需要我知道每个序列化项的大小,然后从流中读取该大小,并将那段字节传递给protobuf解析器进行反序列化。 我想确保没有更容易的机制,不需要了解每个单独项目的长度(可能对于对象的每个实例都不同)来完成此任务。
我想到的另一个想法是将每个即将到来的对象的大小作为它自己在流中的一个对象包含在内,例如:
0: 第一个对象的元数据信息,包括类型/字节长度 1: 在0中定义的对象 2: 第二个对象的元数据信息,包括类型/字节长度 3: 在2中定义的对象 4: ...等等
版本信息: 我目前使用的是dotnet core 3.1和protobuf-net版本2.4.4
SerializeWithLengthPrefix
,您可以将一个项目序列化到流中,然后使用DeserializeWithLengthPrefix
逐个读取项目。我能够使用这些和IAsyncEnumerable<T>
实现从包含大量项目的文件异步读取。感谢 @Marc -- 此外,在我的情况下,我能够将所有内容读入列表,并重新编写文件以支持上述流式传输。 - mhand