Недавно я собрал базовые знания о Java, и информация о сериализации и десериализации Java была подробно рассмотрена. Я буду записать здесь, надеясь, что это также поможет друзьям, которые прочитают эту статью.
1. Концепция сериализации и десериализации
Процесс преобразования объекта в последовательность байтов называется сериализацией объекта.
Процесс восстановления последовательности байтов в объект называется десериализацией объекта.
Есть два основных применения для сериализации объектов:
1) Сохранить байт -последовательность объектов навсегда на жестком диске, обычно в файле;
2) Передача байтовой последовательности объектов в сети.
Во многих приложениях определенные объекты должны быть сериализованы, чтобы они оставляли пространство памяти и переходили к физическому жесткому диску для долгосрочного хранения. Например, наиболее распространенным является объект сеанса на веб -сервере. Когда 100 000 пользователей получают доступ одновременно, могут появиться 100 000 объектов сеанса, и память может не иметь ее нести. Следовательно, веб -контейнер сначала сериализует некоторые виды на жесткий диск и подождите, пока он не будет использован, а затем восстановит объекты, сохраненные в жестком диске в памяти.
Когда два процесса передаются удаленно, они могут отправлять друг другу различные типы данных. Независимо от того, какой тип данных, он будет передаваться в сети в виде двоичной последовательности. Отправитель должен преобразовать этот объект Java в последовательность байтов, чтобы передаваться в сеть; Приемник должен восстановить байты в объект Java.
2. Serialization API в библиотеке классов JDK
java.io.objectOutputStream представляет выходной поток объекта. Его метод writebject (Object obj) может сериализовать объект OBJ, указанный параметром, и записать полученную последовательность байтов в целевой выходной поток.
java.io.objectInputStream представляет поток ввода объекта. Его метод ReadObject () считывает байтовые последовательности из источника входного потока, десериализует их в объект и возвращает их.
Только объекты классов, которые реализуют сериализуемые и внешние интерфейсы, могут быть сериализованы. Внешний интерфейс наследует от сериализуемого интерфейса. Классы, которые реализуют внешний интерфейс, полностью контролируют поведение сериализации, в то время как классы, которые реализуют только сериализуемый интерфейс, могут принять метод сериализации по умолчанию.
Сериализация объекта включает в себя следующие шаги:
1) Создать выходной поток объекта, который может обернуть другой тип целевого выходного потока, такого как выходной поток файла;
2) Напишите объект с помощью метода writebject () выходного потока объекта.
Шаги по десеризации объекта следующие:
1) Создайте поток ввода объекта, который может обернуть другой тип источника входного потока, например, входного потока файла;
2) Прочитайте объект с помощью метода readobject () входного потока объекта.
Примеры сериализации объекта и деспочтения:
Определите класс человека для реализации сериализуемого интерфейса
1 импорт java.io.serializable; 2 3 /** 4 * <p> ClassName: Person <p> 5 * <p> Описание: сериализация и десериализация тестирования <p> 6 * @author xudp 7 * @version 1.0 V 8 * @createtime 2014-6-9 02:33:25 PM 9 * /10 Public Class Personals Serializeable {11 12 /** * ** * SerialVersionUID = -5809782578272943999L; 16 Private Int Age; 17 Private String Same; 18 Private String Sex; 19 20 Public int getage () {21 Возврат возраста; 22} 23 24 Public String getName () {25 return name; 26} 28 28 public getSex () {29 return Sex; 30} 31 32 void void void void void void setage void void void void void void void void void void (inte. Age; 34} 35 36 Public void SetName (String name) {37 this.name = name; 38} 39 40 Public void setsex (строка Sex) {41 this.sex = sex; 42} 43}Сериализовать и десериализовать объекты класса человека
Импорт java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileOutputStream; импорт java.io.ioexception; импорт java.io.objectinptream; import java.io.objectputstream; import java.text.texatemam; Testobjserializeanddeserialize <p> * <p> Описание: сериализация и десериализация объектов тестовых Serializeperson (); // serialize person object person p = deserializeperson (); // deserial perons объектная система. } / ** * MethodName: serializeperson * Описание: serialize person object * @author xudp * @throws filenotfoundexception * @throws ioexception * / private static void serializeperson () thrifors filenotfoundexception, ioexception {person ancep eface (); Person.setName ("gacl"); Person.setage (25); Person.setSex («Мужчина»); // objectOutputStream Object Stupt Stream, храните объект Person в файле Person.txt на диске E и завершите операцию сериализации объекта Person. ObjectOutputStream OO = new ObjectOutputStream (new FileOutputStream (новый файл ("E: /person.txt"))); OO.WriteObject (человек); System.out.println («Секриализация объекта человека была успешно!»); oo.close (); }/** * MethodName: deserializeperson * Описание: Deserializeperson объект * @author xudp * @return * @throhs exception * @throws ioexception */private static deserializeperson () Throws Exception, ioException {objectInptream ois = new ObjectInptream (new FileInputStream (new File (eIsper); Личность = (человек) OIS.ReadObject (); System.out.println ("Человек объектно -дезиализация успешно!"); возвращающийся человек; }}Результаты запуска кода следующие:
После успешного сериализации человека на диск e -диск был сгенерирован на Discem.txt -файл, в то время как десериализирующий человек используется для чтения Person.txt E -диска.
3. Роль Serialversionuid
Seri Al Versi UI D: буквально означает сериализованный номер версии. Все классы, которые реализуют сериализуемый интерфейс, имеют статическую переменную, представляющую сериализованный идентификатор версии.
Частный статический финальный длинный сериал
Если SerialVersionuid не добавлен в класс, появится следующее предупреждение.
Нажатие с мышью поднимает диалоговое окно, которое генерирует SerialVersionUID, как показано на рисунке ниже:
Есть два способа генерирования SerialVersionUid:
Сгенерированное в этом виде SerialVersionUID, например: 1L:
Частный статический конечный длинный SerialVersionuid = 1L;
Созданный таким образом, сгенерированный таким образом, генерируется на основе имени класса, имени интерфейса, метода и атрибута и т. Д. Например:
Частный статический последний длинный серийный режим = 4603642343377807741L;
После добавления предупреждение не появится, как показано ниже:
После разговора об этом, каково использование SerialVersionUID (сериализованный номер версии)? Давайте воспользуемся следующим примером, чтобы проиллюстрировать роль Serialversionuid, и посмотрим на следующий код:
1 импорт java.io.file; 2 импортировать java.io.fileinputstream; 3 Импорт java.io.filenotFoundException; 4 Импорт java.io.fileOutputStream; 5 Импорт java.io.ioException; 6 Импорт java.io.objectInputStream; 7 Импорт java.io.objectOutputStream; 8 Импорт java.io.serializable; 9 10 Общедоступный класс TestSerialversionuid {11 12 Public Static void Main (String [] args) выбрасывает исключение {13 serializecustomer (); // serialize объект клиента 14 Клиент клиент = deserializecustomer (); // Deserial Customer объект 15 System.out.println (Customer); 16} 17/** 19 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @author xudp22 * @Throws filenOtFoundException23 * @Throws ioException24 */25 Private static void serializeCustomer () отбрасывает filenotfoundexception, 26 ioexception {27 customer = new Custom FileOutputStream (30 New File ("E: /Customer.txt"))); 31 OO.WriteObject (клиент); 32 System.out.println ("Следовательно сериализация объекта клиента!"); 33 OO.Close (); 34} 35 36 /** 37 * MEDICALICECUSTOROMER 38 xudp40 * @return41 * @Throws Exception42 * @Throws IOException43 */44 Private Static Customer deserializeCustomer () исключение, ioException {45 ObjectInputStream ois = new ObjectMentpream (новый файл inputStream (46 новый файл ("E: /customer.txt")); OIS.ReadObject (); 48 System.out.println («Дезиализация объекта клиента была успешной! "); 49 возвращать клиент; 50} 51} 52 53 /** 54 * <p> ClassName: Customer <p> 55 * <p> Описание: Клиент реализует сериализуемый интерфейс и может быть сериализованным <p> 56 * @author xudp57 * @version 1.0 v58 * @createTime 2014-6-9 04: 20: 1759 PM *0 /60 PM. {61 // Нет SerialVersionUid62 Private String name; 63 Private Int Age; 64 65 Public Customer (String name, int age) {66 this.name = name; 67 this.age = age; 68} 69 70 / * 71 * @methodname tostring72 * @description rewriting toString () метод объектного класса 73 * athureTOR * @ERUNRING @LURNTOR * @UDURTOR * @ERUNTOR * @ERUNRING @UDURTOR. String75 * @see java.lang.object#toString () 76 */77 @override78 public String toString () {79 return "name =" + name + ", age =" + age; 80} 81}Результаты работы:
Как сериализация, так и десериализация были успешными.
Давайте изменим класс клиента и добавим дополнительный половой атрибут следующим образом:
1 Класс Клиент реализует Serializable {2 // NO SerialVersionUID не определено в частном названии класса 3 Customer; 4 частный возраст; 5 6 // Новый половой атрибут 7 частного строкового секса; 8 9 Public Customer (String name, int age) {10 this.name = name; 11 this.age = age; 12} 13 14 Public Cultip (String name, int age, строка пол) {15 this.name = name; 16 this.age = age; 17 this.sex = sex; 18} 19 / * 21 * @methodname tostring22222222222222 * @description перезаписываю. xudp24 * @return string25 * @see java.lang.object#toString () 26 */27 @overde28 public String toString () {29 return "name =" + name + ", age =" + age; 30} 31}Затем выполните операцию по делу о том, что будет брошена следующая информация об исключении:
1 Исключение в потоке "Main" java.io.invalidclasssexception: клиент; 2 Локальный класс несовместимый: 3 Stream ClassDesc SerialVersionUid = -88175599999432325, 4 локальный класс SerialVersionUID = -5182532647273106745
Это означает, что класс в потоке файлов и класс в группе класса, то есть модифицированный класс, несовместимы. Они находятся под соображениями механизма безопасности. Программа бросает ошибку и отказывается загружать. Так что, если у нас действительно есть необходимость добавить поле или метод после сериализации? Что я должен делать? Это должно указать SerialVersionUid самостоятельно. В примере TestSerialVersionUID, если SerialVersionUID класса клиента не указан, то компилятор Java автоматически выполнит сводный алгоритм для этого класса, аналогично алгоритму отпечатка пальца. Пока файл имеет еще одно пространство, полученный UID будет совершенно другим, что может быть гарантировано, что это число является уникальным среди многих классов. Следовательно, после добавления поля, поскольку SerialVersionUID не указан, компилятор генерирует для нас UID, который, конечно, не совпадает с тем, что сохраняется в файле ранее, поэтому существует две ошибки с непоследовательными номерами версий сериализации. Поэтому, пока мы сами указываем SerialVersionUid, мы можем добавить поле или метод после сериализации, не влияя на более позднее восстановление. Восстановленный объект все еще может быть использован, и есть также больше методов или атрибутов для использования.
Затем продолжайте изменять класс клиента и укажите SerialVersionUid для клиента. Модифицированный код заключается в следующем:
Класс Клиент реализует Serializable { / ** * SerialVersionUID (сериализованный номер версии), определенный в классе клиента * / Private Static Long LongerVerionuid = -5182532647273106745L; Приватное название строки; частный int возраст; // новый половой атрибут // частное строковое секс; Общественный клиент (название строки, int age) {this.name = name; this.age = возраст; } /*public Customer (String name, int age, String sex) {this.name = name; this.age = возраст; this.sex = sex; } *// * * @Methodname toString * @description Перепишите метод toString () класса объекта * @author xudp * @return String * @see java.lang.object#tostring () */ @ @ @ @wut public string toString () {return "=" + name + ", age =" + age; }}Пересмотрите операцию сериализации, сериализируйте объект клиента на хранилище файлов customer.txt на локальном жестком диске, затем измените класс клиента и добавьте половой атрибут. Модифицированный код класса клиента заключается в следующем:
Класс Клиент реализует Serializable { / ** * SerialVersionUID (сериализованный номер версии), определенный в классе клиента * / Private Static Long LongerVerionuid = -5182532647273106745L; Приватное название строки; частный int возраст; // новый половой атрибут частного строкового секса; Общественный клиент (название строки, int age) {this.name = name; this.age = возраст; } public Customer (String name, int age, строка Sex) {this.name = name; this.age = возраст; this.sex = sex; } / * * @MethodName toString * @Description Перепишите метод toString () класса объекта * @author xudp * @return String * @see java.lang.object#tostring () * / @@override public String toString () {return "name =" + name + "," + " + age; }}Выполните операцию по делу о том, что на этот раз будет успешным, как показано ниже:
4. Значение Serialversionuid
Значение SerialVersionUID автоматически генерируется средой выполнения Java, основанной на внутренних деталях класса. Если исходный код класса модифицирован и перекомпилирован, значение также может измениться значение серийного завершения вновь сгенерированного файла класса.
Значение по умолчанию серийного класса полностью зависит от реализации компилятора Java. Для одного и того же класса компиляция с различными компиляторами Java может привести к различным серийным выборам, а также может быть одинаковым. Чтобы улучшить независимость и уверенность в серийном порядке, настоятельно рекомендуется определить SerialVersionUID, отображаемый в сериализуемом классе, присваивая ему четкое значение.
Есть две цели для явного определения Serialversionuid:
1. В некоторых случаях ожидается, что различные версии класса совместимы с сериализацией, поэтому необходимо обеспечить, чтобы различные версии класса имели одинаковые сериал -версии;
2. В некоторых случаях различные версии класса, как ожидается, не будут совместимы с сериализацией, поэтому необходимо обеспечить, чтобы различные версии класса имели разные сериал.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!