序列化:把對象轉化為可傳輸的字節序列過程稱為序列化。
反序列化:把字節序列還原為對象的過程稱為反序列化
序列化的作用是方便存儲和傳輸,細節可參考如下文章:
序列化理解起來很簡單 - 知乎序列化的定義 序列化:把對象轉化為可傳輸的字節序列過程稱為序列化。 反序列化:把字節序列還原為對象的過程稱為反序列化。為什么要序列化?如果光看定義我想你很難一下子理解序列化的意義,那么我們可以從另一個…https://zhuanlan.zhihu.com/p/40462507
直接寫代碼:
import java.io.*;// 通過實現 Serializable 接口,但卻具體實現其方法,就可以標記為可序列化類
class Myclass implements Serializable {// 注意構造初始化后不修改的成員變量可以定義為finalprivate final String str;// 實現構造函數,必定無返回值,所以不用寫void,但構造函數因為外部調用所以為publicpublic Myclass (String str){this.str = str;}public void PrintStr (){System.out.println(this.str);}
}// java 似乎沒有直接的函數概念,所以序列化的展示函數需要定義為類的成員函數
class SerializableExample {public SerializableExample(Myclass obj, String filename) {// 注意先創建一個FileOutputStream(filename) 再以此為參數創建一個 ObjectOutputStream,返回類型為ObjectOutputtry ( ObjectOutput SerializedFile = new ObjectOutputStream(new FileOutputStream(filename))) {//調用成員函數writeObject直接寫入文件SerializedFile.writeObject(obj);System.out.println("Object serialized to " + filename);// 關閉文件SerializedFile.close();} catch (IOException e) {// 如果捕獲異常就打印loge.printStackTrace();}}
}// 反序列化就是從序列化文件中重新恢復原有的類,此處是myclass 的實例 myobj
class DeserializableExample {public static Myclass deserializableExample(String filename) {Myclass obj = null;try ( ObjectInput File = new ObjectInputStream( new FileInputStream(filename) ) ) {obj = (Myclass) File.readObject();System.out.println("Deserialized from " + filename);} catch ( IOException | ClassNotFoundException e ) {e.printStackTrace();}return obj;}}public class Main {public static void main(String[] args) {String filename = "./myobj.txt";// 創建myclass對象Myclass myobj = new Myclass("bitcong");myobj.PrintStr();// 序列化并寫入文件new SerializableExample(myobj, filename );// 從文件中恢復并轉換位myclass的實例myobjMyclass myobj1 = (Myclass) DeserializableExample.deserializableExample(filename);System.out.println("myobj1 str " );myobj1.PrintStr();System.out.println("Done !");}
}
輸出內容如下:
bitcong
Object serialized to ./myobj.txt
Deserialized from ./myobj.txt
myobj1 str?
bitcong
Done !