Главная страница
Навигация по странице:

  • 10) Что делать, если одно из полей сериализовывать не нужно.

  • Ответы на вопросы по ревью 4. Java io. Ключевым понятием здесь является понятие потока


    Скачать 1.93 Mb.
    НазваниеJava io. Ключевым понятием здесь является понятие потока
    Дата03.07.2022
    Размер1.93 Mb.
    Формат файлаdoc
    Имя файлаОтветы на вопросы по ревью 4.doc
    ТипДокументы
    #623608
    страница20 из 39
    1   ...   16   17   18   19   20   21   22   23   ...   39

    Заключение



    В этой статье вы увидели как сериализовать объект, и узнали как работает алгоритм сериализации. Я надеюсь эта статья помогла вам лучше понять что происходит, когда вы сериализуете объект.
    10) Что делать, если одно из полей сериализовывать не нужно.

    Также чтобы исключить поле можно добавить к нему модификатор transient:

    class Book {

    transient String name;

    }

    В предыдущей статье мы рассмотрели 5 различных способов создания объектов в java , я объяснил, как десериализация сериализованного объекта создает новый объект, и в этом блоге я собираюсь подробно обсудить сериализацию и десериализацию.

    Мы будем использовать приведенный ниже объект Employee class в качестве примера для объяснения



    // If we use Serializable interface, static and transient variables do not get serialize

    class Employee implements Serializable {



    // This serialVersionUID field is necessary for Serializable as well as Externalizable to provide version control,

    // Compiler will provide this field if we do not provide it which might change if we modify the class structure of our class, and we will get InvalidClassException,

    // If we provide value to this field and do not change it, serialization-deserialization will not fail if we change our class structure.

    private static final long serialVersionUID = 2L;



    private final String firstName; // Serialization process do not invoke the constructor but it can assign values to final fields

    private transient String middleName; // transient variables will not be serialized, serialised object holds null

    private String lastName;

    private int age;

    private static String department; // static variables will not be serialized, serialised object holds null



    public Employee(String firstName, String middleName, String lastName, int age, String department) {

    this.firstName = firstName;

    this.middleName = middleName;

    this.lastName = lastName;

    this.age = age;

    Employee.department = department;



    validateAge();

    }



    private void validateAge() {

    System.out.println("Validating age.");



    if (age < 18 || age > 70) {

    throw new IllegalArgumentException("Not a valid age to create an employee");

    }

    }



    @Override

    public String toString() {

    return String.format("Employee {firstName='%s', middleName='%s', lastName='%s', age='%s', department='%s'}", firstName, middleName, lastName, age, department);

    }



    // Custom serialization logic,

    // This will allow us to have additional serialization logic on top of the default one e.g. encrypting object before serialization

    private void writeObject(ObjectOutputStream oos) throws IOException {

    System.out.println("Custom serialization logic invoked.");

    oos.defaultWriteObject(); // Calling the default serialization logic

    }



    // Custom deserialization logic

    // This will allow us to have additional deserialization logic on top of the default one e.g. decrypting object after deserialization

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {

    System.out.println("Custom deserialization logic invoked.");



    ois.defaultReadObject(); // Calling the default deserialization logic



    // Age validation is just an example but there might some scenario where we might need to write some custom deserialization logic

    validateAge();

    }



    }


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


    В Java мы создаем несколько объектов, которые живут и умирают соответственно, и каждый объект, безусловно, умрет, когда JVM умрет, но иногда мы можем захотеть повторно использовать объект между несколькими JVM или мы можем захотеть перенести объект на другую машину по сети.

    Ну, сериализация позволяет нам преобразовать состояние объекта в поток байтов, который затем можно сохранить в файл на локальном диске или отправить по сети на любую другую машину. И десериализация позволяет нам обратить процесс вспять, что означает повторное преобразование сериализованного потока байтов в объект.

    Проще говоря, объект сериализация – это процесс сохранения состояния объекта в последовательности байтов, а десериализация – это процесс восстановления объекта из этих байтов. Как правило, полный процесс называется сериализацией но я думаю, что лучше классифицировать их как отдельные для большей ясности.

    Процесс сериализации не зависит от платформы, объект, сериализованный на одной платформе, может быть десериализован на другой платформе.

    Чтобы сериализовать и десериализовать наш объект в файл, нам нужно вызвать ObjectOutputStream.writeObject() и ObjectInputStream.readObject() как это сделано в следующем коде:



    public class SerializationExample {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

    Employee empObj = new Employee("Shanti", "Prasad", "Sharma", 25, "IT");

    System.out.println("Object before serialization => " + empObj.toString());



    // Serialization

    serialize(empObj);



    // Deserialization

    Employee deserialisedEmpObj = deserialize();

    System.out.println("Object after deserialization => " + deserialisedEmpObj.toString());

    }



    // Serialization code

    static void serialize(Employee empObj) throws IOException {

    try (FileOutputStream fos = new FileOutputStream("data.obj");

    ObjectOutputStream oos = new ObjectOutputStream(fos))

    {

    oos.writeObject(empObj);

    }

    }



    // Deserialization code

    static Employee deserialize() throws IOException, ClassNotFoundException {

    try (FileInputStream fis = new FileInputStream("data.obj");

    ObjectInputStream ois = new ObjectInputStream(fis))

    {

    return (Employee) ois.readObject();

    }

    }

    }


    1   ...   16   17   18   19   20   21   22   23   ...   39


    написать администратору сайта