簡體   English   中英

我們如何將GUI類的對象保存(序列化)到Java中的文件中?

[英]How do we save(serialize) an object of a GUI Class to a file in Java?

我在netbeans中有一個GUI類,可從twitter搜索API檢索Tweets,它包含TextAreas,Labels和Editor窗格,這些窗格顯示了源用戶,發布時間,tweet文本等。我​​希望tweets(保存在文件,我需要序列化該類,因此我可以將整個推文另存為文件中的對象。

這聽起來像是您絕對不應該做的事情。 您應該只將推文保存在文件中。 序列化應該是您的最后選擇

不要存儲整個GUI對象,因為將有很多與您不需要的控件相關的東西。 而是創建一個自定義的序列化程序,聽起來不錯,但實際上非常簡單。

以這個簡單的示例為例,該類具有一個框架,該框架的頂部具有用戶名,該名稱未序列化,因為創建的詳細信息只是名稱,因此不需要存儲JFrame對象的其余部分。 其他細節是可以序列化的簡單屬性。

public class Simple implements Serializable {

    private transient JFrame win;
    private String username;
    private Date postTime;
    //...assume getters/setters constructors e.t.c.
    private void writeObject( ObjectOutputStream out ) throws IOException {
        out.write( this );
        out.flush();
    }
    private Object readObject( ObjectInputStream in ) throws IOException, ClassNotFoundException {
        Simple s = (Simple) in.read();
        s.setWin( new JFrame( s.getUsername() ) );
        //...any other extra setup can be done here
        return s;
    }

}

如您所見,我試圖使事情保持簡單,請注意,我只是寫了這篇文章,所以還沒有嘗試過,它更像是一個“入門10”而不是完整的解決方案。 您可以自定義序列化,例如,您可以向流發送Long而不是完整的Date對象,即輸出可能已經out.write(username); out.write(postTime.getTime()); 我們當然允許自動裝箱處理將我們的long變成Long,所以有些偷偷摸摸的jdk可能會將它裝箱成Integer並失去一些精度:)加上對訂單對象的更改被寫入流中應該與從流中讀取的順序進行鏡像。

無論如何,一旦完成,您就可以將對象寫入文件,就像這樣

ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(“ blah.bin”)); Simple s = new Simple(); // ...在s oout.writeObject(s);上設置一些值 oout.flush(); oout.close(); ObjectInputStream oin = new ObjectInputStream(new FileInputStream(“ blah.bin”)); 簡單簡單=(簡單)oin.readObject(); oin.close();

顯然,我沒有包括異常處理和有效使用流所需的大量額外語法,但這只是給出一些想法。

如果您不喜歡這種方法,那么您總是可以嘗試使用對象圖進行xml序列化,這非常方便。 “ java.beans.XMLEncoder”當在db的文本字段中存儲簡單bean時,這是一個非常方便的類:)

正如其他人建議的那樣,序列化數據而不是GUI對象。

現在:數據本身最有可能以JSON格式出現,因此您應該能夠使用與解析JSON相同的工具將JSON寫出(希望像Jackson一樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM