2015-08-30 160 views
1

我的程序中有一個方法從文件中讀取,並且我已經與FileInputStream變量和ObjectInputStream變量相關聯。但是,當我運行該程序時,我不知道有多少對象會被序列化,因此我不知道有多少對象使用readObject()方法進行反序列化。這是我的項目的方法:反序列化問題

public void importResults(File file) throws FileNotFoundException, IOException, ClassNotFoundException { 
    TestEntry entry = null; 
    try(FileInputStream fis = new FileInputStream(file)) { 
     ObjectInputStream ois = new ObjectInputStream(fis); 

     tests.clear(); 

     entry = (TestEntry)ois.readObject(); 

     tests.add(entry); 

     ois.close(); 
    } 
} 

變量條目是在那裏我將存儲,我從文件反序列化的TestEntry對象。問題是,如果我試圖反序列化太多的對象,我得到一個EOFException。如何讓我的程序弄清楚文件中有多少對象被序列化,這樣我可以反序列化正確的數量?任何幫助將不勝感激!謝謝。

+0

你可以發佈你得到的異常的堆棧跟蹤嗎? –

+0

剛剛從readObject捕獲EOFException – krzydyn

回答

1

在循環剛看完,直到你得到EOFException,時,有沒有更多的對象讀取一個拋出。

+0

謝謝,我認爲一旦拋出異常,程序就會完全停止。 – James

+0

我建議你看看語言教程。 – EJP

1

我不認爲有一種方法可以計算有多少對象被序列化,因爲一個文件只能容納一個對象。您可能正在接受EOFException,因爲您正在進行如下操作。由於文件中只有一個對象,無論你有多少序列化,從同一個流讀兩次將導致EOFException。

in.readObject(); 
in.readObject(); 

我只是測試,只要你可以閱讀對象的任何數量的來自同一文件倍,你不這樣做上述或類似的東西。

我的測試低於

public static void main(String []args) { 
    writeObject(new Integer(333)); 
    for(int i = 0; i < 9999; i++) { 
     Integer i = (Integer)readObject(); 
     System.out.println(i);//prints 333 
    } 
} 
public static void writeObject(Object obj) { 
    try { 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file.dat")); 
     out.writeObject(obj); 
     out.close(); 
    } 
    catch(IOException e) {} 
} 
public static Object readObject() { 
    Object obj = null; 
    try { 
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("file.dat")); 

     obj = in.readObject(); 
     in.close(); 
    } 
    catch(IOException e){} 
    catch(ClassNotFoundException e){} 
    return obj; 
} 
1

也許你可以編寫存在於文件和反序列化對象的數量第一次讀到這個數字(不過我不知道,如果一個文件可以包含多個序列化對象)。

但是,如果你把你的對象在ArrayList你序列化,你可以寫ArrayList的文件,並通過閱讀一個對象反序列化。

我做了一個測試類A,該工程:

public class A implements Serializable { 
    int a, b, c; 
} 

public static ArrayList<A> deserializeObjects(File file) throws FileNotFoundException, IOException, ClassNotFoundException { 
    FileInputStream fIn = new FileInputStream(file); 
    ObjectInputStream oIn = new ObjectInputStream (fIn); 
    ArrayList<A> objects = null; 

    // Read array of objects 
    if(fIn.available() > 0) { 
     objects = (ArrayList<A>) oIn.readObject(); 
    } 

    oIn.close(); 
    fIn.close(); 

    return objects; 
} 

public static void serializeObjects(File file, ArrayList<A> objects) throws IOException { 
    FileOutputStream fOut = new FileOutputStream(file); 
    ObjectOutputStream oOut = new ObjectOutputStream(fOut); 

    // Write the whole arraylist to file 
    oOut.writeObject(objects); 
    oOut.flush(); 
    oOut.close(); 
    fOut.close(); 
} 

public static void main(String args[]) throws IOException, ClassNotFoundException { 
    // Make test objects 
    A o1 = new A(); 
    A o2 = new A(); 

    o1.a = 1; o1.b = 2; o1.c = 3; 
    o2.a = 4; o2.b = 5; o2.c = 6; 

    ArrayList<A> objects = new ArrayList<A>(); 
    objects.add(o1); 
    objects.add(o2); 

    File f = new File("yourFile"); 
    f.createNewFile(); 

    serializeObjects(f, objects); // Serialize arraylist 
    ArrayList<A> deserialized = deserializeObjects(f); // Deserialize it 

    // Success?? 
    System.out.println("a : " + deserialized.get(0).a + ", b : " + deserialized.get(0).b + ", c : " + deserialized.get(0).c); 
    System.out.println("a : " + deserialized.get(1).a + ", b : " + deserialized.get(1).b + ", c : " + deserialized.get(1).c); 
} 
0

您可以將對象添加到列表和序列化/反序列化列表。

// entry = (TestEntry)ois.readObject(); 
    List<TestEntry> entries = (List<TestEntry>)ois.readObject();