java 序列化 枚举_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

参考资料

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-05-14 00:15

浏览 3687

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值