系列文章目錄
文章目錄
- 系列文章目錄
- 前言
- 一、Externalizable是什麼?
- 二、使用步驟
- 代碼
前言

我們之前講的對象序列化都是要實作Serializable接口,那麼
對象序列化除了Serializable 還有其它方式嗎
java.io.Serializable接口:
類通過實作 java.io.Serializable 接口以啟用其序列化功能。未實作此接口的類将無法使其任何狀态序列化或反序列化。
可序列化類的所有子類型本身都是可序列化的。序列化接口沒有方法或字段,僅用于辨別可序列化的語義。
如果實作Serializable接口,對象如何序列化,各個屬性序列化的順序是什麼,都是預設的,程式員無法指定,也不用關心。
如果屬性前面有static和transient修飾,不參與序列化。
一、Externalizable是什麼?
Externalizable是另外一個接口
java.io.Externalizable接口:
若某個要完全控制某一對象及其超類型的流格式和内容,則它要實作 Externalizable 接口的 writeExternal 和 readExternal 方法。
程式員在writeExternal方法中,自定定制哪些屬性要序列化,順序是什麼樣。
程式員在readExternal方法中,自定定制哪些屬性要反序列化,順序和writeExternal的方法中一緻。
二、使用步驟
添加一個Goods;類
現在我們要對Goods對象進行輸出
這個時候我們實作接口就不用Serializable了,而是用Externalizable
因為裡面有抽象方法是以需要重寫
- 若某個要完全控制某一對象及其超類型的流格式和内容,則它要實作 Externalizable 接口的 writeExternal 和 readExternal 方法。
- 程式員在writeExternal方法中,自定定制哪些屬性要序列化,順序是什麼樣。
-
程式員在readExternal方法中,自定定制哪些屬性要反序列化,順序和writeExternal的方法中一緻。
注意:
在Externalizable下,可以完全自定義哪些序列化1哪些不序列号,即使是有transient的也可以設定進行序列化
00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼 00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼
代碼
package com.atguigu.test01;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
public class TestObject {
@Test
public void test01() throws IOException{
Goods goods = new Goods("《從入門到放棄》", 99.99, 1000);
Goods.setBrand("atguigu");
FileOutputStream fos = new FileOutputStream("goods.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(goods);
oos.close();
fos.close();
}
@Test
public void test02()throws IOException, ClassNotFoundException{
FileInputStream fis = new FileInputStream("goods.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
System.out.println(obj);
ois.close();
fis.close();
}
}
Goods類:
package com.atguigu.test01;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
public class Goods implements Externalizable{
private static String brand = "尚矽谷";
private String name;
private double price;
private transient int sale;
public Goods(String name, double price, int sale) {
super();
this.name = name;
this.price = price;
this.sale = sale;
}
public Goods() {
super();
}
public static String getBrand() {
return brand;
}
public static void setBrand(String brand) {
Goods.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getSale() {
return sale;
}
public void setSale(int sale) {
this.sale = sale;
}
@Override
public String toString() {
return "Goods [brand = " + brand +",name=" + name + ", price=" + price + ",sale = " + sale +"]";
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
//程式員自己定制要序列化的内容,順序等
//這兩個方法是在對象被序列化和反序列化的過程中,JVM幫我們調用
out.writeUTF(brand);//靜态的也序列化
out.writeUTF(name);
out.writeDouble(price);
out.writeInt(sale);//有transient也序列化
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//程式員自己定制要反序列化的内容,順序等,建議與序列化的順序一緻
brand = in.readUTF();
name = in.readUTF();
price = in.readDouble();
sale = in.readInt();
}
}