Сериализация объекта – это способность объекта сохранять полную копию его и любых других объектов, на которые он ссылается, используя поток вывода (например, во внешний файл). Таким образом, объект может быть воссоздан из сериализованной (сохраненной) копии немного позже, когда это потребуется.
Скачать исходники для статьи можно ниже
Сериализация объектов происходит автоматически благодаря классам
ObjectInputStream и ObjectOutputStream.
Классы ObjectInputStream и ObjectOutputStream являются цепными. Поэтому они не могут работать сами по себе, им необходим один поток для соединения.
Сериализация – это механизм, предоставляющий возможность объекту сохранить свою копию и все другие объекты, на которые ссылается данный объект, во внешний файл с помощью класса ObjectOutputStream.
Сохранены могут быть структуры данных, диаграммы, любые объекты, независимо от их типа.
В то же время, сериализация сохраняет информацию о том, какого типа объект, чтобы в дальнейшем, при десериализации, эта информация использовалась для воссоздания точного типа объекта, которым он был.
Сохранение и чтение данных происходит при помощи методов:
writeObject(ob1) и readObject().
Сериализованные объекты – это просто объекты, которые сохраняются во внешний файл или передаются через сеть для хранения и восстановления.
Не все объекты в java можно сериализовать. Сериализация возможна лишь тех объектов, чьи классы реализуют интерфейс Serializable.
Реализация интерфейса Serializable
Любой класс должен реализовывать интерфейс java.io.Serializable для сериализации объектов этого класса. Интерфейс Serializable не имеет методов и только маркирует класс, чтобы можно было идентифицировать его как сериализуемый.
Если у объекта есть переменная, являющаяся другим объектом, то сериализация этой переменной возможна только при условии, что класс этого объекта реализует интерфейс Serializable.
Другими словами, получаемый таким образом граф этого объекта,
сериализуем полностью. Граф объекта включает дерево или структуру полей объекта и его подобъектов. Если в сериализуемом объекте какая-либо его переменная не сериализуема, то это приведет к исключению NotSerializableException.
Пример сериализации объектов:
public class Game { public static void main(String[] args) throws IOException, ClassNotFoundException { // ClassNotFoundException возможное исключение, если объект не найден Elf elf1 = new Elf("Элайн", 80); String file = "file.txt"; FileOutputStream outPutStream = new FileOutputStream(file); // Открывается поток для соединения ObjectOutputStream objectOutputS = new ObjectOutputStream(outPutStream); // Открывается цепной поток ObjectOutputStream objectOutputS.writeObject(elf1); // у объекта objectOutputS потока ObjectOutputStream вызывается // метод writeObject(), который производит запись объекта elf1 = null; objectOutputS.close(); // закрытие объекта objectOutputS приводит к автоматическому // закрытию объекта outPutStream FileInputStream inPutStream = new FileInputStream(file); ObjectInputStream objectInputS = new ObjectInputStream(inPutStream); Elf elf1New = (Elf) objectInputS.readObject(); // у объекта objectInputS потока ObjectInputStream вызывается // метод readObject(), который производит чтение объекта objectInputS.close(); System.out.println("Эльф " + elf1New.name + " сила " + elf1New.helth); } } import java.io.Serializable; public class Elf implements Serializable {// Имплементация интерфейса Serializable String name; int helth; Elf(String name, int helth) { this.name = name; this.helth = helth; } }
Безопасность в Сериализации.
Сериализация класса в Java, подразумевает передачу всех его данных во внешний файл или базу данных через поток. Мы можем ограничить данные, которые будут сериализованны, когда того пожелаем.
Каждая переменная класса объявленный как transient, не сериализуются (по умолчанию все параметры класса сериализуются).
Поле данных не будет сериализовано с помощью ObjectOutputStream, когда оно будет вызвано для объекта, если это поле данных, данного объекта помечено как transient.
Например:
private transient String password.