В Java все является объектом, и в распределенной среде часто необходимо передать объект из одного конца сети или устройства на другой конец. Это требует протокола, который может передавать данные на обоих концах. Механизм сериализации Java создан для решения этой проблемы.
После преобразования состояния объекта в байтовый поток вы можете сохранить его в файл, используя классы различных байтовых потоков в пакете java.io, подготовить в другой поток или отправить данные объекта на другой хост через сетевое соединение. Функция сериализации объекта очень простая и мощная, и используется в RMI, сокете, JMS и EJB. Проблема сериализации объекта не является самой основной проблемой в сетевом программировании, но она очень важна и имеет много практического значения.
Сериализация объекта Java не только сохраняет данные одного объекта, но и рекурсивно сохраняет данные каждого объекта, на которые ссылается объект. Вся иерархия объекта может быть записана в байтовый поток, сохранена в файле или передана на сетевое соединение. Сериализация объекта может использоваться для выполнения «глубокого копирования» объекта, то есть копирования самого объекта и самого ссылочного объекта. Сериализация объекта может привести к последовательности всего объекта.
Базовый метод использования:
Сериализация относится к сохранению класса или основного типа данных в потоку данных, включая файл, байтовый поток и поток сетевых данных.
Реализация сериализации в Java в основном зависит от двух классов: ObjectOutTream и ObjectInputStream. Это подклассы OutputStream и InputStream в системе Java IO. Поскольку они являются потоками в Java IO, они могут управлять ими, как потоки. Вот как они используются:
импортировать java.io.bytearrayinputstream; импортировать java.io.bytearrayoutputstream; импортировать java.io.ioexception; импортировать java.io.objectinputstream; Импорт java.io.objectOutputStream; импортировать java.io.serializable; Пара открытого класса реализует Serializable {Private Static Final Long SerialVersionuid = -1874850715617681161L; частный тип int; Приватное название строки; public int getType () {return type; } public void settype (int type) {this.type = type; } public String getName () {return name; } public void setName (string name) {this.name = name; } public pare (int type, string name) {super (); this.type = type; this.name = name; } public static void main (string [] args) бросает ioException, classnotfoundexception {// todo автоматическое сгенерированное метод // serialize pare pare bytearrayoutputstream bos = new BytearRayoutputStream (); ObjectOutputStream oos = new objectOutputStream (bos); Пара пара = новая пара (1, "Чарли"); OOS.WriteObject (пара); // Deserialize Object, получить новый объект NewPair Bytearrayinptstream bis = new Bytearrayinputstream (bos.tobytearray ()); ObjectInputStream OIS = new ObjectInputStream (BIS); Пара newpair = (пара) ois.readobject (); System.out.println (newpair.gettype ()+":"+newpair.getName ()); }}1. Оба класса находятся в рисунке декоратора. При их создании они должны пройти в байтовом потоке. Эти потоки - те, которые действительно хранят сериализованные данные ниже.
2. Состоянный класс должен реализовать сериализуемый интерфейс. Этот интерфейс не имеет функций, но это просто маркировочный интерфейс. Если сериализация выполняется на одной машине, а полученные данные передаются на другую машину для десериализации, то классы на этих двух машинах должны быть точно такими же, в противном случае сериализация не будет успешной.
3. Помните, что не использовал ToString, чтобы получить строку в приведенном выше коде, затем получить от этой строки BytearRayinptream, а затем десериализировать ее. Бос хранится в байтах. Преобразование в строку, хранящиеся в символах, неизбежно вызовет изменения данных, а байт [], взятый из строки, не будет предыдущим байтом []. Я столкнулся с этой проблемой, потому что я хочу сохранить сериализованные данные в файле XML. Смотрите еще одну статью в моем конкретном решении этой проблемы:
www.vevb.com/article/88130.htm
Что делает виртуальная машина Java, когда сериализация и десериализация ее?
Механизм сериализации Java в описании этих двух классов подробно описан в Javadoc:
Цитировать
Механизм сериализации по умолчанию для объекта записывает класс объекта, подпись класса и значения всех не транзитных и нестатических полей. Ссылки на другие объекты (за исключением переходных или статических полей) приводят к написанию этих объектов. Многочисленные ссылки на один объект кодируются с использованием механизма обмена эталонами, так что графики объектов могут быть восстановлены в той же форме, что и при написании оригинала.
Механизм сериализации по умолчанию записывает данные в поток включает в себя:
1. Класс, к которому принадлежит объект
2. Подпись класса
3. Все не транспортные и нестатические свойства
4. Ссылки на другие объекты также будут вызывать сериализацию этих объектов.
5. Если несколько ссылок указывают на объект, то будет использоваться ссылочный механизм обмена.
Цитировать
Классы, которые требуют специальной обработки во время процесса сериализации и пустынь, должны реализовать специальные методы с этими точными подписями:
Private void ReadObject (java.io.objectInputStream поток) бросает ioException, classnotFoundException; private void writebject (java.io.objectOutputStream поток) бросает ioException private void readObjectNodata () Throws ObjectStreamException;