2016-07-20 14 views
2

次のコードは私にエラーInvalidClassExceptionを与えます。私のUserクラスはSerializableを実装しています。私はlistUserオブジェクトで満たして保存しようとしていて、それを読み取ることができます。ローカルクラスに互換性のないエラー

List<User> userList = new ArrayList<User>();//list used 
try { 
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(fileName, true)); 

    os.writeObject(userList); 
    os.close(); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} 

// input 
try { 
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); 
    userList = (List<User>) ois.readObject(); 
    ois.close(); 
} catch (FileNotFoundException e1) { 
    e1.printStackTrace(); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} catch (ClassNotFoundException e1) { 
    e1.printStackTrace(); 
} 
+0

"追加"を使用しています。新しいFileOutputStream(fileName、true) '...ファイルが空になりましたか?このファイルは、以前のテストの不正なコンテンツから始まる場合があります。それを削除して再テストしてください。 – AJNeufeld

+0

今後はこれを避ける方法はありますか? –

+0

Err、はい、オブジェクトの出力ストリームに追加しないでください。しかし、それは異なるエラーを引き起こすでしょう。ここでのエラーは、エラーのメッセージに記載されているように、クラス名がクラスと異なることです。 – EJP

答えて

1

あなたが保存し、後でファイルに単一のオブジェクト(あなたの例ではList<>)を取得しようとしている場合は、ないファイルにするたびにあなたをを追加にしたいですかそれに書き込む。むしろ、に、新しいオブジェクトで毎回ファイルを上書きします。

// Write 
List<User> userList = new ArrayList<User>(); 
try (FileOutputStream fos = new FileOutputStream(fileName); 
     ObjectOutputStream oos = new ObjectOutputStream(fos)) { 
    oos.writeObject(userList); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} 

// read 
try (FileInputStream fis = new FileInputStream(fileName); 
     ObjectInputStream ois = new ObjectInputStream(fis)) { 
    userList = (List<User>) ois.readObject(); 
} catch (FileNotFoundException | IOException | ClassNotFoundException e1) { 
    e1.printStackTrace(); 
} 

お知らせnew FileOutputStream(fileName)ないtrue引数を持っていません。 true引数を使用すると、 "append"のためにファイルを開くことを示します。 falseを使用するか、またはappend引数を完全にオフのままにしておくと、ファイルが上書きされます。

注:

は私もtry-with-resources声明私の例を使用しました。これにより、明示的にストリームを閉じる必要がなくなります。ストリームはtry { }ブロックの最後に自動的に閉じられます。

また、3種類の例外を別々に処理していないため、multi-catch句を使用しました。したがって、少し洗練されています。

+0

はい!ありがとう、私はこれ以上狂っていました。 –

+0

既に作成されているファイルに情報(ユーザー)が保存されていれば削除されますか? @AJNeufeld? –

+0

上記のコードは 'List '全体を1つのオブジェクトとして書き込み、そのファイルにあったものをすべて破棄します。ユーザーを追加/変更/削除する場合は、リスト全体(ファイルが存在する場合)を読み込み、必要な変更を行ってリストをファイルに書き出します。 – AJNeufeld

関連する問題