天天看點

java自定義序列化順序_Java自定義序列化

示例

在此示例中,我們要建立一個将生成并輸出到控制台的類,該類是在初始化期間作為參數傳遞的兩個整數範圍之間的随機數。

public class SimpleRangeRandom implements Runnable {

private int min;

private int max;

private Thread thread;

public SimpleRangeRandom(int min, int max){

this.min= min;

this.max= max;

thread = new Thread(this);

thread.start();

}

@Override

private void WriteObject(ObjectOutputStreamout) throws IO Exception;

private void ReadObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

public void run() {

while(true) {

Random rand = new Random();

System.out.println("Thread: " + thread.getId() + " Random:" + rand.nextInt(max - min));

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

現在,如果要使此類可序列化,則将存在一些問題。線程是某些不可序列化的系統級類之一。是以,我們需要将線程聲明為transient。通過這樣做,我們将能夠序列化此類的對象,但是仍然會遇到問題。正如您在構造函數中看到的那樣,我們設定了随機化器的最小值和最大值,然後啟動了負責生成和列印随機值的線程。是以,通過調用readObject()構造函數恢複持久對象時,由于不會建立新對象,是以構造函數将不會再次運作。在這種情況下,我們需要通過在類内部提供兩個方法來開發自定義序列化。這些方法是:

private void writeObject(ObjectOutputStream out) throws IOException;

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

是以,通過在中添加實作,readObject()我們可以啟動和啟動線程:

class RangeRandom implements Serializable, Runnable {

private int min;

private int max;

private transient Thread thread;

//瞬變應該是無法序列化的任何字段e.gThread或您不想序列化的任何字段

public RangeRandom(int min, int max){

this.min= min;

this.max= max;

thread = new Thread(this);

thread.start();

}

@Override

public void run() {

while(true) {

Random rand = new Random();

System.out.println("Thread: " + thread.getId() + " Random:" + rand.nextInt(max - min));

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

private void writeObject(ObjectOutputStream oos) throws IOException {

oos.defaultWriteObject();

}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {

in.defaultReadObject();

thread = new Thread(this);

thread.start();

}

}

這是我們示例的主要内容:

public class Main {

public static void main(String[] args) {

System.out.println("Hello");

RangeRandom rangeRandom = new RangeRandom(1,10);

FileOutputStream fos = null;

ObjectOutputStream out = null;

try

{

fos = new FileOutputStream("test");

out = new ObjectOutputStream(fos);

out.writeObject(rangeRandom);

out.close();

}

catch(IOException ex)

{

ex.printStackTrace();

}

RangeRandom rangeRandom2 = null;

FileInputStream fis = null;

ObjectInputStream in = null;

try

{

fis = new FileInputStream("test");

in = new ObjectInputStream(fis);

rangeRandom2 = (RangeRandom)in.readObject();

in.close();

}

catch(IOException ex)

{

ex.printStackTrace();

}

catch(ClassNotFoundException ex)

{

ex.printStackTrace();

}

}

}

如果運作main,則将為每個RangeRandom執行個體運作兩個線程,這是因為該方法現在同時在構造函數和。Thread.start()readObject()