天天看點

00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼

系列文章目錄

文章目錄

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

前言

00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼

我們之前講的對象序列化都是要實作Serializable接口,那麼

對象序列化除了Serializable 還有其它方式嗎

java.io.Serializable接口:

類通過實作 java.io.Serializable 接口以啟用其序列化功能。未實作此接口的類将無法使其任何狀态序列化或反序列化。

可序列化類的所有子類型本身都是可序列化的。序列化接口沒有方法或字段,僅用于辨別可序列化的語義。

如果實作Serializable接口,對象如何序列化,各個屬性序列化的順序是什麼,都是預設的,程式員無法指定,也不用關心。

如果屬性前面有static和transient修飾,不參與序列化。

一、Externalizable是什麼?

00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼

Externalizable是另外一個接口

java.io.Externalizable接口:

若某個要完全控制某一對象及其超類型的流格式和内容,則它要實作 Externalizable 接口的 writeExternal 和 readExternal 方法。

程式員在writeExternal方法中,自定定制哪些屬性要序列化,順序是什麼樣。

程式員在readExternal方法中,自定定制哪些屬性要反序列化,順序和writeExternal的方法中一緻。

二、使用步驟

添加一個Goods;類

00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼
00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼

現在我們要對Goods對象進行輸出

00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼

這個時候我們實作接口就不用Serializable了,而是用Externalizable

00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼

因為裡面有抽象方法是以需要重寫

00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼
00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼
00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼
00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、Externalizable是什麼?二、使用步驟代碼
00023.01 序列化接口:Serializable和Externalizable(補充)系列文章目錄前言一、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();
	}
	
}

           

繼續閱讀