`

readResolve

    博客分类:
  • Java
阅读更多

public class Dog extends Exception {
	public static final Dog INSTANCE = new Dog();
	
	private Dog() {
		
	}
	
	public String toString() {
		return "Woof";
	}
	
	//make instance  the same one
	private Object readResolve() {
		return INSTANCE;
	}
}



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

public class CopyDog {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Dog newDog = (Dog) deepCopy(Dog.INSTANCE);
		System.out.println(newDog == Dog.INSTANCE);
		System.out.println(newDog);
	}

	private static Object deepCopy(Object obj) throws Exception {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		new ObjectOutputStream(bos).writeObject(obj);
		ByteArrayInputStream bin = new ByteArrayInputStream(bos.toByteArray());
		return new ObjectInputStream(bin).readObject();
	}
	
	

}



分享到:
评论

相关推荐

    java 中序列化与readResolve()方法的实例详解

    `readResolve()`方法通常用于解决反序列化时可能产生的副作用,如在反序列化过程中创建不必要的新对象,或者为了确保反序列化的对象与原始对象具有相同的逻辑状态。此外,这个方法也可以用于优化,比如返回一个已经...

    Effective c#中文版

    《Effective C#中文版》是一本面向C#程序员的实用指南,旨在帮助读者提升C#编程技巧和理解力。这本书提供了50个实践性的建议,每个建议都详细讲解了一个具体的编程最佳实践,以帮助开发者写出更高效、更可维护的代码...

    Java单例模式设计

    `readResolve()`方法会在反序列化时调用,返回的是单例的唯一实例,从而保证了单例的正确性。 总结起来,Java单例模式有多种实现方式,每种都有其适用场景。饿汉单例适用于对性能敏感且对延迟初始化无要求的情况;...

    设计模式_创建型_单例模式.md

    当单例对象实现java.io.Serializable接口后,即使单例类实现了readResolve()方法,但反序列化过程中仍然会创建一个新的实例。为了防止这种破坏单例的方式,可以在单例类中重写readResolve()方法,并返回当前类的唯一...

    单例模式介绍

    通过`readResolve()`方法,反序列化时会返回现有的单例实例,而不是创建新的。 在Android Studio 3.0.1的环境下,开发者可以利用这些单例模式进行项目开发,优化代码结构,提高代码的可维护性和效率。同时,理解并...

    实验一对象序列化的说明1

    `writeReplace`方法允许在序列化前替换对象,`readResolve`方法则允许在反序列化后替换对象。 5. 总结 对象序列化是Java中一种重要的功能,它使得对象的状态能够被持久化或者在网络中传输。虽然Java提供了一套默认...

    Java存储与读取对象源码

    最后,`readResolve`和`writeReplace`方法可以用来控制序列化过程中替换的对象,这对于实现单例模式或其他高级用例非常有用。 总结来说,Java对象的存储与读取涉及到对象序列化和反序列化,通过实现`Serializable`...

    序列化类的作用Serializable

    `readResolve()`则是在反序列化时用来替换读取的对象,通常用于处理类版本控制或者单例模式。 为了确保序列化和反序列化的兼容性,Java引入了一个名为`serialVersionUID`的版本号。这是一个长期(long)类型的静态...

    1.设计模式-单例设计模式1

    为了避免这种情况,可以在单例类中添加`readResolve()`方法: ```java class SerializableSingleton implements Serializable { private static final long serialVersionUID = 1L; private static final ...

    Java关键字Transient与串行化

    在这个例子中,即使`pwd`字段被声明为`transient`,通过实现`readResolve`方法,仍然可以在反串行化时为其设置默认值“guest”。 #### 总结 `transient`关键字是Java串行化过程中一个非常实用的功能,它可以有效地...

    开发模式知识点

    3. **readResolve()方法**:这是为了序列化而设计的方法。当对象进行反序列化时会调用此方法。这里重写了该方法,确保即使经过序列化和反序列化后,对象仍能保持单例。 #### 单例模式的优点 1. **资源优化**:单例...

    singleton.zip单例的几种实现demo,

    为了解决这个问题,可以添加`readResolve()`方法: ```java public class Singleton implements Serializable { private static final long serialVersionUID = 1L; private static Singleton instance = new ...

    7种单例模式

    对于反序列化测试,由于默认反序列化会生成新实例,需要重写 `readResolve()` 方法来防止这种情况。 ```java private Object readResolve() { return INSTANCE; } ``` 这将确保反序列化时返回的是已存在的单例实例...

    java 对象序列化

    `readResolve()` 和 `writeReplace()` 是两个特殊的方法,可以用来自定义序列化和反序列化的行为。`readResolve()` 在反序列化时被调用,可以返回替换对象;`writeReplace()` 在序列化时被调用,可以返回一个代理...

    Spring常见面试题

    * 序列化:可以添加readResolve方法来解决 * 反射:可以在构造函数中抛异常 * 克隆模式:不要使用克隆模式 代理模式 代理模式是指一个对象不能直接访问另一个对象时,提供一个代理对象来间接访问的设计模式。代理...

    单例设计模式个人总结+摘录

    2. **避免反序列化攻击**:为单例类实现`readResolve()`方法,确保即使反序列化也不会创建新实例。 - **示例代码**: ```java public class Singleton implements Serializable { private static final long ...

    ObjectStreamClass

    为了防止恶意代码利用,Java提供了`writeReplace()`和`readResolve()`方法,允许对象在序列化和反序列化时替换自身,以增强安全性。 5. **类版本控制**:`ObjectStreamClass`维护了每个类的序列化版本ID...

    java序列化对象的存储和读取共6页.pdf.zip

    - 使用`writeReplace()`和`readResolve()`方法可以替换序列化和反序列化时使用的对象,从而优化序列化过程。 - `Externalizable`接口提供了一种自定义序列化和反序列化方式,但需要手动编写序列化逻辑。 8. **`...

    Java重构示例五[定义].pdf

    `SortMode` 类还实现了 `readResolve()` 方法,这是一个用于序列化时恢复对象的特殊方法,确保在反序列化时能正确地返回已存在的 `SortMode` 实例,而不是创建新的对象。此外,`INSTANCES` 静态成员变量是一个映射,...

Global site tag (gtag.js) - Google Analytics