Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СТП / lec / java2014-lec-10

.pdf
Скачиваний:
8
Добавлен:
03.03.2016
Размер:
1.29 Mб
Скачать

Пример сериализации

В нашем примере 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

Соседние файлы в папке lec