一个Singleton类如果可序列化,则除实现java.io.Serializable标记接口,还需定义
private Object readResolve() throws ObjectStreamException;
如果没有第二步则在反序列化的时候会重新生成一个对象.因而失去了Singleton.
原因在于:反序化也相当于构造方法生成一次对象.
import java.io.*;
public class Thing implements Serializable
{
private int id;
private String name;
private static Thing thing = new Thing();
private Thing() {
this.id = -1;
this.name = "default";
}
public static Thing getInstance() {
return thing;
}
public String toString() {
return "Thing:[" + this.id + "," + this.name + "]";
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
private Object readResolve() throws ObjectStreamException {
return thing;
}
public static void main(String[] args) throws Exception{
Thing thing = Thing.getInstance();
System.out.println(thing);
thing.setName("new name");
System.out.println(thing);
Thing thing2 = Thing.getInstance();
System.out.println(thing2);
System.out.println(thing == thing2);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
new FileOutputStream(
new File("F:/aa.txt")));
objectOutputStream.writeObject(thing);
objectOutputStream.close();
ObjectInputStream objectInputStream = new ObjectInputStream(
new FileInputStream(
new File("F:/aa.txt")));
Thing thingSerializble = (Thing)objectInputStream.readObject();
objectInputStream.close();
System.out.println(thing == thingSerializble);
System.out.println(thingSerializble);
}
}
分享到:
相关推荐
可以通过实现Serializable接口并重写readResolve()方法来解决这个问题。 此外,Singleton模式虽然简单易用,但也有一些缺点,如违背了开闭原则(对扩展开放,对修改关闭),导致程序难以进行单元测试,以及在某些多...
public class Singleton implements Serializable { private static final long serialVersionUID = 1L; private static Singleton instance = new Singleton(); private Object readResolve() { return ...
5. **生命周期管理**:在某些容器(如Spring框架)中,Singleton模式的生命周期可能与容器的生命周期冲突,需要谨慎使用。 6. **扩展性**:Singleton模式可能导致系统不易扩展,因为它限制了类的实例化,可能阻碍了...
2. **序列化**:如果单例类实现了`Serializable`接口,需要处理反序列化时可能创建新实例的问题,通常在`readResolve()`方法中返回现有实例。 3. **懒汉式与饿汉式**:懒汉式(延迟初始化)在类加载时不创建实例,...
public class Singleton implements Serializable { // ... protected Object readResolve() throws ObjectStreamException { return getInstance(); } } ``` `readResolve()`方法会在反序列化时调用,返回的...
public class Singleton implements Serializable { private static final long serialVersionUID = 1L; private static Singleton instance; private Singleton() {} public static Singleton getInstance()...
与静态常量类似,但在类加载时初始化,线程安全,但可能导致资源浪费。 ```java public class Singleton { private static Singleton instance; static { instance = new Singleton(); } private Singleton...
- 序列化问题:如果单例类实现了Serializable接口,那么在反序列化时可能会创建新的实例。为避免这种情况,可以在单例类中添加`readResolve()`方法。 - 测试问题:单元测试中,为了测试的灵活性,可能需要多次创建...
参见 http://blog.csdn.net/xcl168 Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把... 其中Parcelable接口 Serializable接口 Singleton模式 Bundle方式各有一个代表性的例子。
4. 避免序列化破坏单例:如果单例实现了`Serializable`接口,序列化和反序列化可能导致多个实例。为此,可以在单例类中添加`readResolve()`方法来返回唯一的实例。 总的来说,Java的单例设计模式是一种强大的工具,...
private static final StaticSingleton INSTANCE = new StaticSingleton(); private StaticSingleton() {} public static StaticSingleton getInstance() { return INSTANCE; } } ``` 2. 懒汉式单例(Lazy...
1. **序列化与反序列化**:如果单例类实现了`Serializable`接口,那么在反序列化时会生成新的实例。为了避免这种情况,我们需要在单例类中添加`readResolve()`方法。 2. **反射攻击**:通过反射调用私有构造函数也...
preferences存储键值数据具有工厂构造函数的Singleton模式使用mockito单元测试特征按城市名称搜索显示城市的天气状况检测当前位置并显示其天气状况记住以前搜索过的位置依存关系json_serializable 地理定位器shared_...
#### 三、`Thread.notify()`与`Thread.wait()`用法与作用 - **`notify()`**:唤醒正在等待该对象锁的一个线程。调用`notify()`前必须获得该对象的锁。 - **`wait()`**:使当前拥有锁的线程进入等待状态,并释放锁,...
typeof(MyRemoteService), "MyService", WellKnownObjectMode.Singleton); ``` 在客户端,你可以通过指定的URL获取到远程服务的引用,然后像调用本地对象一样调用其方法: ```csharp // 获取远程服务的引用 ...
通过putExtra()方法,我们可以传递基本类型(如String、Integer)以及Parcelable和Serializable接口的实例。对于ArrayList或ArrayMap等容器,如果它们的元素实现了Parcelable或Serializable接口,也可以通过Intent...
专题:单例模式与MX记录 com.javapatterns.multilingual 专题:多例模式与多语言支持 com.javapatterns.keygen 专题:序列键生成器与单例及多例模式 com.javapatterns.builder 建造者模式 ...
38. **序列化/反序列化**:使用`Serializable`接口使对象可序列化,`ObjectOutputStream`和`ObjectInputStream`进行序列化和反序列化操作。 39. **数据类型占字节数**:int占4字节,float占4字节,short占2字节,...
### MVC总结大全——深入解析Utils工具类、Entity实体类与DAO层Service层知识 #### 一、Utils工具类知识——请求和响应 在Java Web开发中,`Utils`工具类通常用于封装一些常用功能,如数据库操作、网络请求处理等...
### JAVA基础面试题与SpringCloud知识点解析 #### 1. 对象初始化顺序 根据题目中的示例代码,我们可以看到在Java中对象初始化的过程遵循一定的顺序: 1. **类加载后,执行静态初始化**:首先执行的是`static`块或...