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

  • Как сериализовать статическое поле

  • Опишите процесс сериализации/десериализации с использованием Serializable.

  • Externalizable

  • Как изменить стандартное поведение сериализации/десериализации (Externalizable)

  • Как исключить поля из сериализации

  • Ревью 5. Что такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4


    Скачать 110.73 Kb.
    НазваниеЧто такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4
    АнкорРевью 5
    Дата24.12.2022
    Размер110.73 Kb.
    Формат файлаdocx
    Имя файлаРевью 5.docx
    ТипДокументы
    #861326
    страница9 из 13
    1   ...   5   6   7   8   9   10   11   12   13

    Какие поля не сериализуются?


    Static (если не сделали нужный static метод) и transient

    Переходные и статические поля не сериализуются

    Если мы хотим сериализовать один объект, но не хотим сериализовать определенные поля, мы можем пометить эти поля как временные .

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

    Как сериализовать статическое поле?


    Если вам нужно сериализовать статические поля, вы должны делать это вручную. (Создать статический метод, которые сериализует статическое поле)

    Написать в классе свою реализацию методов writeObject и readObject, вызовите методы defaultReadObject и defaultWriteObject, которые обрабатывают нормальную сериализацию, а затем приступить к сериализации и де-сериализации любых дополнительных полей, которые вам нужны.

    private void writeObject(ObjectOutputStream oos) throws IOException {

    oos.defaultWriteObject();

    oos.writeObject(new Integer(newBookingNumber)); //static field

    }

    2. Использовать Externalizable

    3. При использовании Serializable эти поля вообще не сериализуются (и, соответственно, их значение не меняется, т.к. static поля принадлежат классу, а не объекту). А вот при использовании Externalizable программист управляет процессом сам, поэтому технически сделать это можно. Но не рекомендуется, так как это чревато трудноуловимыми ошибками.

    Опишите процесс сериализации/десериализации с использованием Serializable.


    При использовании Serializable применяется алгоритм сериализации, который с помощью рефлексии (Reflection API) выполняет:

    запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор SerialVersionUID, идентификаторы полей класса);

    рекурсивную запись в поток описания суперклассов до класса java.lang.Object (не включительно);

    запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса;

    рекурсивную запись объектов, которые являются полями сериализуемого объекта.

    При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками.

    Для выполнения десериализации под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается. Однако при десериализации будет вызван конструктор без параметров родительского несериализуемого класса, а его отсутствие повлечёт ошибку десериализации.

    Externalizable


    Производительность. Интерфейс Serializable имеет много плюсов (простота, удобство), но производительность не из их числа.

    — Генерит много служебной информации

    — основан на Reflection API (? — есть отдельная статья https://javarush.ru/groups/posts/513-reflection-api-refleksija-temnaja-storona-java)

    Гибкость. Serializable вообще не позволяет управлять процессом, кроме исключения полей или добавление (через свою реализацию методов writeObject/readObject).

    Безопасность. Иногда необходимо шифрование данных.

    https://javalearningandreviews.wordpress.com/2020/09/23/%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B4%D0%B5%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F/

    Как изменить стандартное поведение сериализации/десериализации (Externalizable)?


    Реализовать интерфейс java.io.Externalizable, который позволяет применение пользовательской логики сериализации. Способ сериализации и десериализации описывается в методах writeExternal() и readExternal(). Во время десериализации вызывается конструктор без параметров, а потом уже на созданном объекте вызывается метод readExternal.

    Если у сериализуемого объекта реализован один из следующих методов, то механизм сериализации будет использовать его, а не метод по умолчанию :

    writeObject() - запись объекта в поток;

    readObject() - чтение объекта из потока;

    writeReplace() - позволяет заменить себя экземпляром другого класса перед записью;

    readResolve() - позволяет заменить на себя другой объект после чтения.

    Как исключить поля из сериализации?


    Для управления сериализацией при определении полей можно использовать ключевое слово transient, таким образом исключив поля из общего процесса сериализации.
    1   ...   5   6   7   8   9   10   11   12   13


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