1、概念java
對象是由一個程序建立的,當程序被關掉,對象天然就消失了。爲了可以使得對象可以保存還原,甚至經過網絡等傳輸,就有了對象序列化這個概念。我是以爲和持久化一個概念。java對象序列化最強大的一個方面是針對對象全部連環的引用都可以進行保存,而且可以反序列化。網絡
2、實現this
1.在java中對象序列化必需要繼承Serializable接口,這個接口只是一個標識,標示可以進行序列化。該對象所引用的其餘對象,以及其餘對象所引用的其餘其餘對象也必須繼承Serializble接口,否則序列化時會拋出異常java.io.NotSerializableException。還要生成serialVersionUID,這個ID是根據屬性和方法生成的。表示版本號。若是反序列化的時候,版本號不一致就會拋出異常。code
2.序列化的實現很是簡單:首先要有一個ObjectOutputStream 對象 ,而後調用writeObject(Object objec)方法就好了。反序列化須要有一個ObjectInputStream對象,而後調用readObject()方法。再強行轉換成你要的類就好了。對象
3、demo繼承
public class Wheel implements Serializable{ private static final long serialVersionUID = 5801095499370035805L; private String id; private String brand; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } }
public class Car implements Serializable{ private static final long serialVersionUID = 5765553644244739065L; private Wheel[] wheel ; private String brand; private int price ; private String ow; public Wheel[] getWheel( ) { return wheel; } public void setWheel(Wheel[] wheel) { this.wheel = wheel; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }
public static void main(String[] args) throws IOException, ClassNotFoundException{ FileOutputStream fos = new FileOutputStream(new File("/home/liubin/test.txt")); ObjectOutputStream oos = new ObjectOutputStream(fos); Wheel[] wheel = new Wheel[4]; wheel[0] = new Wheel(); wheel[0].setBrand("JIATONG"); wheel[0].setId("00001"); wheel[1] = new Wheel(); wheel[1].setBrand("JIATONG"); wheel[1].setId("00002"); wheel[2] = new Wheel(); wheel[2].setBrand("JIATONG"); wheel[2].setId("00003"); wheel[3] = new Wheel(); wheel[3].setBrand("JIATONG"); wheel[3].setId("00004"); Car car = new Car(); car.setPrice(800000); car.setBrand("BMW"); car.setWheel(wheel); oos.writeObject(car); oos.flush(); oos.close(); //反序列化 FileInputStream fis = new FileInputStream(new File("/home/liubin/test.txt")); ObjectInputStream ois = new ObjectInputStream(fis); Object object = ois.readObject(); ois.close(); Car cars = (Car)object; System.out.println(car); System.out.println(cars); System.out.println(car == cars); } }
最終Car對象寫入到文件中,而後可以反序列化。接口
關於Externalizable這個類是繼承了Serializable,可是能夠實現對序列化的一些控制,就很少說了。還有一點就是transient這個關鍵字修飾的屬性或者是方式是不參與序列化的。此外使用static修飾的屬性也是不參與序列化的。get