2011-12-04 6 views
0

ファイルにシリアル化された(同じクラスの)いくつかのオブジェクトがあります。 逆シリアル化中に、最初にシリアル化されたオブジェクトだけがデシリアライズされます。1つのファイルから複数のオブジェクトを直列化復元する

コードシリアル化する:

public void save() { 
File f = new File("vehicule.txt"); 
try { 
    if(!f.exists()) f.createNewFile(); 
} catch(IOException e) { 
} 
try { 
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f,true)); 
oos.writeObject(this); 
} catch(IOException e) { 
} 

}

を私はこの問題はであると思う:

Vehicule v; 
while((v = (Vehicule)ois.readObject()) != null) 

は、ファイルの終わりを確認する良い方法はありますか?

+0

オブジェクトをファイルにシリアル化する方法を表示できますか?あなたがカスタムシリアル化プロセスを行っているようです。 –

+2

あなたはあなたの問題が実際に何であるかを言わずに、例外を捕捉してから破棄する方法を見て、それが何であるかを言うことはできません。 – kdgregory

+0

ObjectOutputStreamはテキストファイルを生成しません。それはバイナリです。 – EJP

答えて

1

ファイルの先頭にあるビークルの数を書き留めて、読み取った回数を制御する方が良いでしょう。あなたはそれをあなたがそれをやっている方法を実行したい場合は

、あなたはIOExceptionがキャッチ/しようとする必要があります

あなたがいる場合

+0

デシリアライズされたオブジェクトの数を使用することは役に立ちません。最初のオブジェクトだけが印刷されます –

+0

リストをシリアライズ TJR

1

[またところで、これはtxtファイルではありません]複数ObjectOutputStreams追加使用しようと、私はthisが(!あなたがファイルにあなたがあなたのテストを実行するたびに削除を確認することと一緒に)役立つかもしれないと信じて:複数の追加ObjectOutputStreamsを含むファイルをすることができないのはなぜ

1つのObjeによって非直列化されたctInputStream?シリアライズのデフォルトの実装を使用して

は、ObjectOutputStream建設と ObjectInputStream建設の間 1対1のマッピングが存在する必要があります。 ObjectOutputStreamコンストラクタ はストリームヘッダーを書き込み、ObjectInputStreamはこのストリームを読み取ります ヘッダー。回避策は、ObjectOutputStreamをサブクラス化し、 writeStreamHeader()を上書きすることです。それはファイル への最初の書き込みであり、それは ファイル内の既存のObjectOutputStreamに追加されている場合、それはObjectOutputStream.reset()を呼び出す必要がある場合は上書きwriteStreamHeader()は スーパーwriteStreamHeaderメソッドを呼び出す必要があります。

そうでなければ私はあなたが単一ObjectOutputStreamListにオブジェクトを追加し、それをシリアル化を示唆しています。例えば

Vehicule v1 = new Vehicule(); 
    Vehicule v2 = new Vehicule(); 
    List<Vehicule> vehicules = Arrays.asList(v1, v2); 

    // serialize the list of Vehicules 
    File f = new File("vehicule.txt"); 
    try { 
     ObjectOutputStream oos = new ObjectOutputStream(
       new FileOutputStream(f)); 
     oos.writeObject(vehicules); 
     oos.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); // handle this appropriately 
    } 

    // deserialize the list of Vehicules 
    try { 
     ObjectInputStream ois = new ObjectInputStream(
       new FileInputStream(f)); 
     List<Vehicule> deserializedVehicles = (List<Vehicule>) ois.readObject(); 
     ois.close(); 
     System.out.println("list size = " + deserializedVehicles.size()); 
    } catch (Exception e) { 
     e.printStackTrace(); // handle this appropriately 
    } 

私にとって、これは出力:あなたはそれのいずれかを必要としない

list size = 2 
+0

私はArrayListでそれを試みました。いずれも動作しませんでした –

+0

シリアライゼーションコードを追加しました。あなたは 'Vehicule'クラス(' oos.writeObject(this); ')でsave()メソッドを実装したようです。リストとしてシリアライズするには、そのクラス外のすべてのVehiculesをシリアル化する必要があります(1つのメソッド呼び出しで)。 –

+0

@NiceBooks定義した "did not work"。 – EJP

0
try { 
    if(!f.exists()) f.createNewFile(); 
} catch(IOException e) { 
} 

new FileOutputStream()がファイルを作成します。

new ObjectOutputStream(new FileOutputStream(f,true)) 

ObjectOutputStreamに追加することはできません。そこには、ObjectInputStreamがストリームの途中でそれらに出会うかどうかわからないヘッダがあります。

while((v = (Vehicule)ois.readObject()) != null) 

ファイルの末尾を確認する良い方法はありますか?

readobject()はEOSでnullを返すことについてのJavadocには何もありません。 readObject()nullと書いた場合にのみnullを返します。

正しい方法は、EOFExceptionを捕まえて、ストリームを閉じて、ループから抜け出すことです。

0

複数のオブジェクトを1つのファイルにまとめるのではなく、ArrayList<Vehicle>をシリアライズ/デシリアライズするだけです。

0

これは最終的にどのように働いたかです。
ファイル内のすべてを、ArrayListにデシリアライズしました。新しいオブジェクトを追加し、直列化中にArrayListの各要素をファイルに追加しました。[(new FileOutputStream(new File("Vehicule.txt"),false)を使って前のエントリを消去します]。
最後に、デシリアライズを助けるために、ファイルに明示的にnullを追加しました。
また、createNewFileで初めてファイルを作成するときに、ファイルにnullを追加しました。

関連する問題