2

我假设我的应用程序正在更新文件时,机器电源被切断了。当重新打开并启动我的应用程序时,它试图反序列化文件。调用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”

4

1 回答 1

3

我没有太多可以继续下去的……我想简短的版本是:这取决于文件中剩下的内容

您可以做的一件事是遍历文件以查看其中的内容:

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 是子对象等”),那么您可以使输出更详细。

于 2012-10-01T20:03:12.523 回答