Пример сериализации
В нашем примере Portolio (Портфель) состоит из набора
Stocks (акций).
•В процессе сериализации текущая цена не сохраняется,
поэтому соответствующий атрибут помечен как transient.
•В этом случае необходимо, что в процессе десериализации стоимость акций была установлена в соответствии с текущими рыночными ценами.
31
Запись и чтение объектов из потока
public static void main(String[] args) { Stock s1 = new Stock("ORCL", 100, 32.50); Stock s2 = new Stock("APPL", 100, 245); Stock s3 = new Stock("GOGL", 100, 54.67);
Portfolio p = new Portfolio(si, s2, s3); // Portfolio - корневой объект try (FileOutputStream fos = new FileOutputStream(args[0]);
ObjectOutputStream out = new ObjectOutputStream(fos)) {
// Метод writeObject записывает объектный граф p в файловый поток out.writeObject(p);
} catch (IOException i) {
System.out.println("Exception writing out Portfolio:
}
try (FilelnputStream fis = new FilelnputStream(args[0]); ObjectlnputStream in = new ObjectlnputStream(fis)) {
// Метод readObject восстанаваливает объект из файлового потока
Portfolio newP = (Portfolio) in.readObject();
}catch (ClassNotFoundException | IOException i) { System.out.println("Exception reading in Portfolio1: + 1) ;
}
}
32
Сериализирующий метод
Сериализируемые объекты могут управлять процессом
сериализации собственных полей.
public class MyClass implements Serializable { // Fields
private void writeObject(ObjectOutputStream oos) throws IOException {
//вызывается для сериализации всех атрибутов объекта oos.defaultWriteObject();
//Запись дополнительных полей
oos.writeObject(new java.util.Date());
}
Например, этот класс дописывает текущее время (в виде объекта!) в объектный граф.
При десериализации вызывается аналогичный метод:
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {}
33
Пример реализации readObject
public class Stock implements Serializable { private static final long serialVersionUID = 100L; private String symbol;
private int shares;
private double purchasePrice; private transient double currPrice;
public Stock(String symbol, int shares, double purchasePrice) { this.symbol = symbol;
this.shares = shares; this.purchasePrice = purchasePrice;
//Атрибут currPrice устанаваливается с помощью метода setStockPrice
//в процессе создания объекта. Но проблема в том,
//что при десериализации конструктор не вызывается
setStockPrice();
}
// Метод десериализации
private void readObject(ObjectlnputStream ois)
throws IOException, ClassNotFoundException { ois.defaultReadObject(); // считывание всех атрибутов
//остальная инициализация
//Атрибут currPrice устанавливается после десериализации всего объекта setStockPrice();
}
34