【发布时间】:2014-05-09 11:05:47
【问题描述】:
我正在使用 protobuf 将大对象序列化为二进制文件,以便反序列化并在以后再次使用。但是,我在反序列化一些较大的文件时遇到了问题。这些文件的大小约为 2.3 GB,当我尝试反序列化它们时,会抛出几个异常(按以下顺序):
- 子消息读取不正确
- 线型无效;这通常意味着您在没有截断或设置长度的情况下覆盖了文件;见Using Protobuf-net, I suddenly got an exception about an unknown wire-type
- 源数据中出现意外的端组;这通常意味着源数据已损坏
我查看了第二个例外中提到的问题,但这似乎并未涵盖我遇到的问题。
我正在使用 Microsoft 的 HPC 包来生成这些文件(它们需要一段时间),因此序列化如下所示:
using (var consoleStream = Console.OpenStandardOutput())
{
Serializer.Serialize(consoleStream, dto);
}
我正在阅读以下文件:
private static T Deserialize<T>(string file)
{
using (var fs = File.OpenRead(file))
{
return Serializer.Deserialize<T>(fs);
}
}
文件是两种不同的类型。一个大小约为 1GB,另一个约为 2.3GB。较小的文件都可以工作,而较大的文件则不能。任何想法这里可能出了什么问题?我意识到我没有提供很多细节,可以根据要求提供更多。
【问题讨论】:
-
反序列化和2.3 GB已经听错了。忽略错误,对如此 huge 数据量使用任何类型的序列化的想法是不好的。您能否详细说明您想通过使用序列化解决什么问题?
-
@Sinatr 是的,我已经意识到这可能不是最好的路线,但我现在有文件,所以试图挽救它们。我需要能够生成这些文件并将它们保存到磁盘以供以后使用。
-
有什么用?你能准确地说出这些文件是什么吗?也许您决定通过使用序列化或其他方式传输(导出/导入?)数据,其中序列化(对于如此数量的数据)是一个坏主意。考虑使用自定义文件格式,大数据(HPC包?那是什么?)只是1对1复制,而小部分(包含配置,路径,参数等)以经典方式序列化,然后与大数据组合.
-
@geekchic 我必须承认,我的单元测试套件没有扩展到多 GB 文件。这可能只是与
int相关的读者问题,可能应该是long;我得找个时间调查一下。 -
@MarcGravell 但你必须承认:这是一个很酷的错误!也许还有一个检查算术编译器选项的案例。
标签: c# protobuf-net