JAVA序列化(2) 特殊类型的序列化 单例模式和枚举类实现

JAVA序列化(二) 特殊类型的序列化 单例模式和枚举类实现

简介

 由于反序列化时会重新生成一个新的对象实例,这与单例模式和枚举类实现唯一性原则相违背,为了使它们不矛盾,必须修改反 序列化的流程来实现唯一性

 

实现

 在目标类中增加下列方法:

 private Object readResolve();

 

1)单例模式

StudentSingleton.java

package com.siyuan.serializable;

import java.io.Serializable;

public class StudentSingleton implements Serializable{

	private static final long serialVersionUID = -6060021285898900767L;
	
	private int id;
	
	private static final StudentSingleton instance = new StudentSingleton(1);
	
	private StudentSingleton(int id) {
		this.id = id;
	}
	
	public static StudentSingleton getInstance() {
		return instance;
	}
	
	private Object readResolve() {
		System.out.println("readResolve ... ");
		return instance;
	} 
	
}

 

StudentSingletonTest.java

package com.siyuan.serializable.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.siyuan.serializable.StudentSingleton;

public class StudentSingletonTest {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		StudentSingleton stu = StudentSingleton.getInstance();
		
		System.out.println(stu);
		System.out.println("Serialized begin...");
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		ObjectOutputStream objOutput = new ObjectOutputStream(output);
		objOutput.writeObject(stu);
		System.out.println("Serialized end...");
		
		System.out.println("Deserialized begin...");
		ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
		ObjectInputStream objInput = new ObjectInputStream(input);
		StudentSingleton stuDe = (StudentSingleton) objInput.readObject();
		System.out.println("Deserialized end...");
		
		System.out.println(stuDe);
	}

}

 

运行结果

com.siyuan.serializable.StudentSingleton@757aef
Serialized begin...
Serialized end...
Deserialized begin...
readResolve ... 
Deserialized end...
com.siyuan.serializable.StudentSingleton@757aef

 

2)枚举类实现

ColorEnum.java

package com.siyuan.serializable;

import java.io.Serializable;

public class ColorEnum implements Serializable{
	
	private static final long serialVersionUID = 3995474245155583240L;

	public static final ColorEnum RED = new ColorEnum("red");
	
	public static final ColorEnum GREEN = new ColorEnum("green");
	
	public static final ColorEnum BLUE = new ColorEnum("blue");
	
	private String color;
	
	private ColorEnum(String color) {
		this.color = color;
	}
	
	private Object readResolve() {
		System.out.println("readResolve ... ");
		if ("red".equals(this.color)) {
			return RED;
		} else if ("green".equals(this.color)) {
			return GREEN;
		} else if ("blue".equals(this.color)) {
			return BLUE;
		} else {
			throw new IllegalStateException();
		}
	} 
	
}

 

ColorEnumTest.java

package com.siyuan.serializable.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.siyuan.serializable.ColorEnum;

public class ColorEnumTest {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		ColorEnum red = ColorEnum.RED;
		
		System.out.println(red);
		System.out.println("Serialized begin...");
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		ObjectOutputStream objOutput = new ObjectOutputStream(output);
		objOutput.writeObject(red);
		System.out.println("Serialized end...");
		
		System.out.println("Deserialized begin...");
		ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
		ObjectInputStream objInput = new ObjectInputStream(input);
		ColorEnum redDe = (ColorEnum) objInput.readObject();
		System.out.println("Deserialized end...");
		
		System.out.println(redDe);
	}

}

 

运行结果

com.siyuan.serializable.ColorEnum@757aef
Serialized begin...
Serialized end...
Deserialized begin...
readResolve ... 
Deserialized end...
com.siyuan.serializable.ColorEnum@757aef

 

参考资料

http://www.javapractices.com/home/HomeAction.do