У меня проблема с сериализацией класса с использованием шаблона singleton. Во-первых, позвольте мне представить код:Сериализация с шаблоном проектирования Singleton
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? Если нет, как я могу это сделать? Это очень важно.
Как вы можете видеть, в конструкторе создается новая матрица. Если я deserialize, мой
data
, который был перезаписан этим конструктором? Для десериализации я хочуdata
сериализованной версии, а не новую матрицу. Конструктор мне нужен только первый раз перед сериализацией, чтобы создать экземпляр объекта.Прежде чем я начну сериализовать, я установлю поле
timestamp
ко времени сериализации. После десериализации я хотел бы сравнить это поле с меткой времени некоторых файлов (чтобы увидеть, изменились ли файлы после сериализации). Какую временную метку следует использовать как для времени сериализации, так и для последнего измененного времени файлов, чтобы я мог легко сравнивать?
Это не очень понятно, почему вы должны сериализовать операции одиночки Но я хотел бы предложить:. Сериализовать только (кажется, что это единственное, что когда-либо меняется в синглетоне), и просто позвольте синглету строить нормально. Или даже лучше, не используйте синглтон, используйте инъекцию зависимостей;) –
@PierreHenry С помощью операции это было просто пример. Да, меняет только матрица. Как я могу только сериализовать матрицу, а потом десериализовать матрицу обратно в синглтон? – machinery
@PierreHenry Мне также нужно знать ialize timestamp. – machinery