使用Protobuf-net恢复损坏的文件序列化

时间:2012-10-01 19:48:09

标签: c# file-io protobuf-net

当我假设我的应用程序正在更新文件时,机器电源被切断了。当重新打开并且我的应用程序启动时,它尝试反序列化该文件。对Serializer.Deserialize的调用没有失败,但结果对象具有每个属性的默认值。

我的文件更新/保存:

using (FileStream theStream = File.Open(fileName + "_tmp", FileMode.Create)) {
    ProtoBuf.Serializer.Serialize<MyObject>(theStream, inObjectToSerialize);
}
File.Copy(fileName + "_tmp", fileName, true);

没有_tmp文件,只有主文件。文件的大小不为零,这使我相信信息是完整的。有没有办法恢复这些数据?

更新

我已经尝试过使用ProtoReader的Marc建议,问题中的文件会导致reader.ReadFieldHeader()抛出异常。 ProtoException读取:“源数据中的无效字段:0”

1 个答案:

答案 0 :(得分:2)

我没有太多可以继续...我想短版本将是:它取决于文件中剩下的内容

你可以做的一件事就是走文件看看有什么:

using (var input = File.OpenRead(path))
using (var reader = new ProtoReader(input, RuntimeTypeModel.Default, null))
{
    while (reader.ReadFieldHeader() > 0)
    {
        Console.WriteLine("offset {0}, field {1}, type {2}",
            reader.Position, reader.FieldNumber, reader.WireType);
        reader.SkipField();
    }
}

这至少可以让你看到当前处理的数据量。

如果您知道某些字段的布局(即“字段3是字符串,字段7是子对象等”),那么您可以使输出更加详细。