读书人

JAVA序列化(2) 特殊类型的序列化 单例

发布时间: 2012-08-24 10:00:21 作者: rapoo

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@757aefSerialized 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@757aefSerialized begin...Serialized end...Deserialized begin...readResolve ... Deserialized end...com.siyuan.serializable.ColorEnum@757aef

?

参考资料

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

读书人网 >编程

热点推荐