Этот процесс также может быть реализован через сеть, которая может сначала создать объект на машине Windows, сериализовать его, а затем отправить его на машину UNIX по сети, а затем точно собирать его. Почему каждый из RMI, Socket, JMS и EJB пройти Java объекты?
Механизм сериализации объекта Java обычно имеет два использования:
Java Javabeans: Информация о статусе бобов обычно настраивается во время дизайна. .. Прочитайте состояние объекта, чтобы реконструировать объект и восстановить состояние программы.
RMI позволяет управлять объектами на удаленных машинах, как на собственных машинах;
Мы можем сериализовать классы, делая классы реализовать интерфейс Java.io.io.iserializable. Этот интерфейс является интерфейсом производителя. То есть, чтобы класс, чтобы реализовать его, интерфейсу не нужно реализовать какой -либо метод. В основном используется для уведомления виртуальных машин Java (JVM) о том, что объект должен быть сериализован.
Есть несколько моментов, которые нам нужно уточнить для этого:
Не все классы могут быть сериализованы.
В Java есть много основных классов, которые реализовали сериализуемые интерфейсы, такие как строка, вектор и т. Д. Но, например, Hashtable не реализует сериализуемый интерфейс.
Существует два основных класса для чтения или написания объектов для потоков: objectOutputStream и ObjectInputStream.ObjectOutputStream предоставляет метод wriptObject, используемый для записи объектов в выходной поток, а ObjectInputStream предоставляет метод ReadObject для чтения объектов из входного потока. Объекты, использующие эти методы, должны быть сериализованы. То есть сериализуемый интерфейс должен быть реализован. Если вы хотите написать объект Hashtable, то вы получите исключение.
Процесс сериализации состоит в том, чтобы записать объекты и читать объекты из байтового потока. После преобразования состояния объекта в байтовый поток вы можете сохранить его в файл, используя различные классы потока байтов в пакете java.io, подготовить в другой поток или отправить данные объекта на другой хост через сетевое соединение. Функция сериализации объекта очень простая и мощная, и используется в RMI, сокете, JMS и EJB. Проблема сериализации объекта не является самой захватывающей темой в сетевом программировании, но она довольно важна и имеет много практического значения.
Сериализация объекта может реализовать распределенные объекты. Основные приложения, такие как: RMI использует сериализацию объектов для запуска служб на удаленных хостах, как при запуске объектов на локальных машинах.
Сериализация объекта Java не только сохраняет данные одного объекта, но и рекурсивно сохраняет данные каждого объекта, на которые ссылается объект. Вся иерархия объекта может быть записана в байтовый поток, сохранена в файле или передана на сетевое соединение. Сериализация объекта может использоваться для выполнения «глубокого копирования» объекта, то есть копирования самого объекта и самого ссылочного объекта. Сериализация объекта может привести к всей последовательности объектов.
Сериализация Java относительно проста и обычно не требует написания индивидуального кода для сохранения и восстановления состояния объекта. Объекты класса, которые реализуют java.io.serializable интерфейс, могут быть преобразованы в байтовые потоки или восстановлены из байтовых потоков без добавления какого -либо кода в класс. Только в редких случаях пользовательский код, необходимый для сохранения или восстановления состояния объекта. Примечание здесь: не каждый класс может быть сериализован, а некоторые классы не могут быть сериализованы.
Механизм сериализации:
Сериализация разделена на две части: сериализация и десериализация. Сериализация является первой частью этого процесса, разбивая данные на поток байтов для хранения в файле или передаче по сети. Десериализация - это открыть байтовый поток и восстановить объект. Сериализация объекта не только требует преобразования основного типа данных в представление байтов, но иногда также восстанавливает данные. Восстановление данных требует экземпляра объекта, который восстанавливает данные. Процесс сериализации в ObjectOutputStream подключен к байтовому потоку, включая тип объекта и информацию версии. Во время десериализации JVM генерирует экземпляр объекта с информацией заголовка, а затем копирует данные из потока байта объекта с элементами данных объекта. Давайте объясним это в двух частях:
Поток объектов обработки: ( процесс сериализации и процесс десериализации)
У пакета Java.io есть два класса, которые сериализуют объекты. ObjectOutputStream отвечает за написание объектов в байтовый поток, а ObjectInputStream реконструирует объекты из байтового потока.
Давайте сначала поймем класс objectOutputStream. Класс objectOutputStream расширяет интерфейс DataOutput.
Метод writeobject () является наиболее важным методом для сериализации объекта. Если объект содержит ссылки на другие объекты, метод writeobject () рекурсивно сериализует эти объекты. Каждый ObjectOutputStream поддерживает сериализованную эталонную таблицу объекта, чтобы предотвратить отправку нескольких копий одного и того же объекта. (Это важно). Поскольку writebject () может сериализовать весь набор объектов с перекрестными ссылками, тот же экземпляр объекта ObjectOutputStream может случайно попросить сериализовать тот же объект. В настоящее время вместо того, чтобы снова писать по потоку байтового потока объекта.
Далее, давайте поймем класс objectOutputStream из примера.
Кода -копия выглядит следующим образом:
// сериализуйте сегодняшнюю дату в файл.
FileOutputStream f = new FileOutputStream ("tmp");
ObjectOutputStream s = new objectOutputStream (f);
S.WriteObject («Сегодня»);
S.WriteObject (новая дата ());
s.flush ();
Теперь давайте поймем класс ObjectInputStream. Это похоже на ObjectOutputStream. Он расширяет интерфейс DataInput. Методы в ObjectInputStream отражают общедоступный метод чтения основных типов данных Java в DataInputStream. Метод readObject () десериализует объект из байтового потока. Каждый раз, когда используется метод ReadObject (), возвращается следующий объект в потоке. Поток байта объекта не передает байт -код класса, но включает в себя имя класса и его подпись. Когда ReadObject () получает объект, JVM загружает указанный класс в заголовке. Если этот класс не может быть найден, ReadObject () бросает ClassNotFoundException. Остальные методы ObjectIntInputStream используются для настройки процесса десериализации.
Примеры следующие:
Кода -копия выглядит следующим образом:
// DeSurialize строки объектов и объекты даты из файла
FileInputStream in = new FileInputStream ("TMP");
ObjectInputStream S = новый объект InturePtream (in);
String сегодня = (String) s.ReadObject ();
Дата дата = (дата) s.readobject ();
Индивидуальный процесс сериализации:
Сериализация обычно может быть выполнена автоматически, но иногда процесс может контролироваться. Java может объявлять классы как сериализуемые, но все еще может вручную управлять членами данных вручную, объявленными статичными или временными.
Пример: очень простой класс сериализации.
Кода -копия выглядит следующим образом:
открытый класс simpleSerializableClass реализует сериализуемые {
String stoday = "Сегодня:";
Переходная дата dttoday = new Date ();
}
При сериализации все члены данных класса должны быть последовательными, за исключением тех, которые объявляются как переходные или статические. Объявление переменной как переходной, говорит JVM, что мы будем нести ответственность за сериализацию аргументов. После объявления члена данных переходным процессом процесс сериализации не может добавить его в поток байтовых объектов, и не отправляются данные из члена переходных данных. После того, как десериализация данных впоследствии должен быть реконструирован членом (поскольку он является частью определения класса), но не содержит никаких данных, поскольку этот член данных не записывает никаких данных в потоку. Помните, что потоки объектов не сериализуют статические или временные. Наш класс должен использовать методы writebject () и readobject () для обработки этих членов данных. При использовании методов writebject () и readObject () вы также должны обратить внимание на чтение этих членов данных в том порядке, который они написаны.
Некоторые из кодов о том, как использовать пользовательскую сериализацию, следующие
Кода -копия выглядит следующим образом:
// Перепишите метод writebject () для обработки переходных членов.
public void writebject (objectOutputStream outputStream) бросает ioException {
outputStream.defaultwriteObject (); // Сделать метод writeObject ()
// Использование встроенной логики в автоматической сериализации.
outputStream.WriteObject (opocket.getInetAddress ());
outputStream.writeint (opocket.getport ());
}
// Перепишите метод ReadObject () для получения переходных членов.
Private void ReadObject (ObjectInputStream InputStream) бросает ioException,
ClassNotFoundException {
inputStream.defaultReadObject (); // DefaulTreadObject () дополнения автоматической сериализации
InetAddress oaddress = (inetAddress) inputStream.readObject ();
int iport = inputstream.readint ();
opocket = новая розетка (Oaddress, iport);
iid = getId ();
dttoday = new Date ();
}
Полностью настройте процесс сериализации:
Если класс абсолютно ответственен за свою собственную сериализацию, он реализует внешний интерфейс вместо сериализуемого интерфейса. Определение Extraizable интерфейса включает в себя два метода writeexternal () и readexternal (). Эти методы могут использоваться для управления тем, как элементы данных объекта записаны в байтовые потоки. , нет автоматической сериализации вообще. Обратите внимание здесь. Объявление класса внедряет экстернатизируемые интерфейсы со значительными рисками безопасности. Методы writeexternal () и readexternal () объявляются публичными, а вредоносные классы могут использовать эти методы для чтения и записи данных объектов. Если объект содержит конфиденциальную информацию, будьте очень осторожны. Это включает в себя использование защищенных сокетов или шифрование всего байтового потока. На данный момент мы узнали базовые знания сериализации.