Looking for java Keywords? Try Ask4Keywords

Java Language Базовая сериализация в Java


пример

Что такое сериализация

Сериализация - это процесс преобразования состояния объекта (включая его ссылки) в последовательность байтов, а также процесс перестройки этих байтов в живой объект в будущем. Сериализация используется, когда вы хотите сохранить объект. Он также используется Java RMI для передачи объектов между JVM, либо как аргументы в вызове метода от клиента к серверу, либо как возвращаемые значения из вызова метода, либо как исключения, создаваемые удаленными методами. В общем случае сериализация используется, когда мы хотим, чтобы объект существовал за время существования JVM.

java.io.Serializable - это интерфейс маркера (не имеет тела). Он просто используется, чтобы «маркировать» классы Java как сериализуемые.

Сериализация runtime связывает каждый сериализуемый класс с номером версии, называемым serialVersionUID , который используется во время де- сериализации для проверки того, что отправитель и получатель сериализованного объекта загружают классы для этого объекта, которые совместимы с сериализацией. Если получатель загрузил класс для объекта с другим serialVersionUID чем класс соответствующего класса отправителя, то десериализация приведет к InvalidClassException . Сериализуемый класс может объявить свой собственный serialVersionUID явно, объявив поле с именем serialVersionUID которое должно быть static, final, и long :

ANY-ACCESS-MODIFIER static final long serialVersionUID = 1L;

Как сделать класс подходящим для сериализации

Чтобы сохранить объект, соответствующий класс должен реализовать интерфейс java.io.Serializable .

import java.io.Serializable;

public class SerialClass implements Serializable {

    private static final long serialVersionUID = 1L;  
    private Date currentTime;
    
    public SerialClass() {
        currentTime = Calendar.getInstance().getTime();
    }

    public Date getCurrentTime() {
        return currentTime;
    }
}

Как написать объект в файл

Теперь нам нужно записать этот объект в файловую систему. Для этой цели мы используем java.io.ObjectOutputStream .

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;

public class PersistSerialClass {

    public static void main(String [] args) {
        String filename = "time.ser";            
        SerialClass time = new SerialClass(); //We will write this object to file system.
        try {
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
            out.writeObject(time); //Write byte stream to file system.
            out.close();
        } catch(IOException ex){
            ex.printStackTrace();
        }
     }
 }

Как воссоздать объект из его сериализованного состояния

Сохраненный объект может быть прочитан из файловой системы позже, используя java.io.ObjectInputStream как показано ниже:

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
import java.io.java.lang.ClassNotFoundException;

 public class ReadSerialClass {

    public static void main(String [] args) {
        String filename = "time.ser";    
        SerialClass time = null;

        try {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
            time = (SerialClass)in.readObject();
            in.close();
        } catch(IOException ex){
            ex.printStackTrace();
        } catch(ClassNotFoundException cnfe){
            cnfe.printStackTrace();
        }
        // print out restored time
        System.out.println("Restored time: " + time.getTime());
     }
 }

Сериализованный класс находится в двоичной форме. Отмена десериализации может быть проблематичной, если определение класса изменяется: подробности см. В главе «Версии Serialized Objects» спецификации Java Serialization .

Сериализация объекта сериализует весь граф объектов, который является корнем, и работает корректно в присутствии циклических графов. Метод reset() предоставляется, чтобы заставить ObjectOutputStream забыть об объектах, которые уже были сериализованы.

Переходные поля - Сериализация