【发布时间】:2016-02-25 16:13:14
【问题描述】:
我在使用单例模式对类进行序列化时遇到问题。先介绍一下代码:
import java.io.ObjectStreamException;
import java.io.Serializable;
import org.ejml.simple.SimpleMatrix;
public class Operation implements Serializable {
private static final long serialVersionUID = 1L;
private final static int CONSTANT = 10;
private SimpleMatrix data;
private Long timestamp;
private static Operation instance = new Operation ();
private Operation () {
data = new SimpleMatrix(1, CONSTANT);
}
protected static Operation getInstance() {
return instance;
}
//Hook for not breaking the singleton pattern while deserializing.
private Object readResolve() throws ObjectStreamException {
return instance;
}
protected void setData(SimpleMatrix matrix) {
this.data = matrix;
}
protected SimpleMatrix getData() {
return data;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
}
我有三个问题希望有人可以帮助我:
据我所知,静态字段没有序列化。因此,如果我反序列化,我的最终静态字段 CONSTANT 是否设置为 10?如果没有,我该怎么做?这很重要。
如您所见,在构造函数中创建了一个新矩阵。如果我反序列化,我的
data会被这个构造函数覆盖吗?对于反序列化,我想要序列化版本的data而不是新矩阵。构造函数我只需要在序列化前第一次实例化对象。在序列化之前,我会将字段
timestamp设置为序列化时间。反序列化后,我想将此字段与某些文件的时间戳进行比较(以查看自序列化以来文件是否已更改)。我应该为文件的序列化时间和最后修改时间使用哪种时间戳,以便我可以轻松比较?
【问题讨论】:
-
我不太清楚为什么需要序列化 Operation 单例。但我建议:仅序列化矩阵(似乎它是单例中唯一改变的东西),并让单例正常构建。或者更好的是,不要使用单例,使用依赖注入;)
-
@PierreHenry 手术只是一个例子。是的,只有矩阵发生了变化。我怎样才能只序列化矩阵,然后再将矩阵反序列化回单例?
-
@PierreHenry 我还需要序列化时间戳。
-
添加必要的逻辑作为你的单例方法:例如保存状态和恢复状态。或者在外面做,然后做 setMatrix 或类似的事情。
标签: java serialization deserialization