0


シリアル化を使用して、Androidアプリにデータを保存しています。ユーザーがファイルを開くことができないと報告するまで、すべてがうまく機能します。
彼が送ってくれたファイルを調べたところ、readObject()のときのEOFExceptionが問題であることがわかりました。

.serファイルをvimで開きましたが、空ではありません。正常に開くことができる他のファイルと同じように正常に見えます。
ユーザーが.serファイルを保存しても、驚くことはありませんでした。

私の質問は次のとおり
です。1。そもそもシリアル化を使用するのは間違った決定ですか?
2.私のコードはほとんどの場合正常に機能しますが、最終的にこの問題を引き起こす何かを見逃した可能性があります。
3.ユーザーは、ファイルが彼にとって非常に重要であると言ったので、このファイルを開くための回避策を本当に見つけたいと思います。

ファイルの読み取り方法のコードは次のとおりです。

    FileInputStream f_in = null;
    ObjectInputStream obj_in = null;

    f_in = new FileInputStream(fileName);
    obj_in = new ObjectInputStream (f_in);
    mBlock = (Block)obj_in.readObject();

これが、シリアライズ可能ファイルを保存するために使用するコードです。

saveObjToFile(mBlock, mFileName);

static void saveObjToFile(Serializable object, String fileName)                     
throws IOException{
    FileOutputStream f_out = null;
    ObjectOutputStream obj_out  = null;
    try{
        File note_file = new File(fileName);
        f_out = new FileOutputStream(note_file);
        obj_out = new ObjectOutputStream (f_out);
        obj_out.writeObject(object);
        obj_out.flush();
        obj_out.close();
    }finally{
        if (obj_out != null)
            try{
                obj_out.close();
            }catch(IOException e){

            }
        if (f_out != null)
            try{
                f_out.close();
            }catch(IOException e){

            }
    }
}

ブロック定義のコードスニペットは次のとおりです。

public class Block implements Serializable{
        private static final long serialVersionUID = -4369689728261781215L;
        private int mType;
        private byte[] mContent;
        private ArrayList<Block> mChildren = null;
        //... no more attributes.
}
4

2 に答える 2

0

シリアライズ可能を保存するためのコードでは、例外はどこで処理されますか?

ファイルを読み取ることができないため、ファイルの書き込み中に例外が発生したと考えるのが安全だと思います。私の考えでは、エラーが発生した後に単に出力ストリームを閉じただけでファイルを回復できるかどうかは疑わしいです。

于 2011-05-28T04:17:32.217 に答える
0

EOFException は正常です。これは、オブジェクト ストリームの最後に到達したことを意味します。最初のオブジェクトを読み取ったときに取得した場合、ストリームにはオブジェクトがありません。オブジェクト出力ストリーム ヘッダーがあることに注意してください。そうしないと、別の例外が発生するため、空にはなりません。オブジェクトが空です。

于 2011-05-28T23:55:26.373 に答える