Использование Serializable кроме объекта "Запись и чтение" в / из файла
В каких случаях хорошей практикой кодирования является использование сериализуемых реализаций, отличных от объекта записи и чтения в / из файла. В проекте я прошел код. Использование класса реализует сериализуемость, даже если в этом классе / проекте нет объектов записи / чтения в / из файла?
7 ответов
Если объект покидает JVM, в которой он был создан, класс должен реализовывать Serializable.
Сериализация - это метод, с помощью которого объект может быть представлен в виде последовательности байтов, которая включает в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.
После записи в файл сериализованного объекта его можно прочитать из файла и десериализовать, то есть информацию о типе и байты, которые представляют объект и его данные, можно использовать для воссоздания объекта в памяти.
Это основная цель десериализации. Чтобы получить информацию об объекте, типе объекта, информации о типе переменной из письменного (свободно говоря) представления объекта. И, следовательно, сериализация требуется в первую очередь, чтобы сделать это возможным.
Поэтому, когда у вашего объекта есть возможность покинуть JVM, в которой выполняется программа, вы должны сделать класс реализующим Serializable.
Чтение / запись объектов в файлы (память) или передача объекта через Интернет или любой другой тип соединения. Всякий раз, когда объект покидает JVM, в которой он был создан, он должен реализовывать Serializable, чтобы его можно было сериализовать и десериализовать для распознавания после его возвращения в другую / ту же JVM.
Много хорошего читает на:
Преимущества сериализации:
Сохранять данные для будущего использования.
Для отправки данных на удаленный компьютер с использованием клиент-серверных технологий Java, таких как RMI, программирование сокетов и т. Д.
Свести объект в массив байтов в памяти.
Для отправки объектов между серверами в кластере.
Для обмена данными между апплетами и сервлетами.
Хранить сеанс пользователя в веб-приложениях
Для активации / пассивации корпоративных Java-бинов.
Вы можете обратиться к этой статье для более подробной информации.
Если вы когда-нибудь ожидаете, что ваш объект будет использоваться в качестве данных в настройке RMI, они должны быть сериализуемыми, так как RMI либо нуждается в объектах Serializable
(если они должны быть сериализованы и отправлены на удаленную сторону) или быть UnicastRemoteObject
если вам нужна удаленная ссылка.
В более ранних версиях java (до java 5) маркерные интерфейсы были хорошим способом объявления метаданных, но в настоящее время у нас есть аннотация, которая более мощна для объявления метаданных для классов.
Аннотация предоставляет очень гибкие и динамические возможности, и мы можем предоставить конфигурацию для мета-мета аннотации, которую мы хотим отправить либо в виде байтового кода, либо во время выполнения.
Здесь Если вы не хотите читать и писать объект, то от сериализации остается одна цель: объявить метаданные для класса, и если вы собираетесь объявлять метаданные для класса, то лично я предлагаю вам не использовать сериализацию, просто переходите к аннотациям,
Аннотация - лучший выбор, чем интерфейс маркера, а JUnit - прекрасный пример использования Аннотация, например, @Test для определения класса тестирования. То же самое можно сделать с помощью интерфейса Test mark.
Есть еще один пример, который показывает, что аннотации - лучший выбор. @ThreadSafe выглядит намного лучше, чем реализация интерфейса маркера ThraedSafe.
В других случаях вы хотите отправить объект по значению, а не по ссылке:
- Отправка объектов по сети.
Не могу отправить объекты по ссылке здесь.
- Многопоточность, особенно в Android
Android использует Serializable/Parcelable для отправки информации между действиями. Это как-то связано с отображением памяти и многопоточностью. Я не очень понимаю это все же.
Наряду с ответом Martin C.. я хочу добавить это - если вы используете Serializable
тогда вы можете легко загрузить Object
график в память. Например, у вас есть Student
класс, который имеет Deportment
, Так что если вы сериализуете свой Student
тогда Department
также будет сохранен. Более того, это также позволит вам -
1. переименовывать переменные в сериализованном классе, сохраняя обратную совместимость.
2. получить доступ к данным из удаленных полей в новой версии (другими словами, изменить внутреннее представление ваших данных при сохранении обратной совместимости).
Некоторые инфраструктуры / среды могут зависеть от сериализации объектов данных. Например, в J2EEHttpSession
атрибуты должны быть сериализуемыми, чтобы использовать постоянство сеанса. Также RMI и другие артефакты темных веков используют сериализацию.
Таким образом, хотя вам может не потребоваться, чтобы ваши объекты данных сразу стали сериализуемыми, возможно, имеет смысл объявить Serializable на всякий случай (это почти бесплатно, если вам не нужно испытывать трудности с объявлением методов readObject/writeObject)