`
orange5458
  • 浏览: 347219 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    实验12 单例模式与枚举.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    枚举类实现单例,并且解决序列化给前端展示的问题.zip

    本源码由 springboot 开发,只有2个简单的文件(1是 枚举类单例,2是 controller请求测试类)。 主要测试了枚举类的饿汉式加载机制 / 单例机制。 代码中包含枚举类的基本使用,和完整的请求示例。 主要实现了枚举类...

    Java实验7 序列化.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验5 JAVA常用类.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java实验6多线程.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验1 Java环境搭建.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验9 Java输入输出流.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    【Java设计模式】你对单例模式了解多少,一文深入探究

    目录单例模式懒汉式单例模式未初始化问题解决Double Check 双重检查方案一:不让第二步和第三步重排序-DoubleCheck方案二:基于类初始化-静态内部类饿汉式饿汉式与懒汉式最大区别序列化破坏单例模式原理枚举单例基于...

    Java实验8 数据库.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java实验3泛型.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java实验2 反射.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java补充实验.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java实验4 注解.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验2 Java语言基础.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java实验1代码.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验7 成员访问控制与异常.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验8 javaFX程序设计.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验5 网络编程.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验9 Servlet.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    实验10 JSP.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

Global site tag (gtag.js) - Google Analytics