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

私がそこに行くことはあまりありません...短いバージョンは次のようになると思います:ファイルに何が残っているかによって異なります

できることの 1 つは、ファイルを調べてそこに何があるかを確認することです。

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 に答える