当我假设我的应用程序正在更新文件时,机器电源被切断了。当重新打开并且我的应用程序启动时,它尝试反序列化该文件。对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”
答案 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是子对象等”),那么您可以使输出更加详细。