Java предоставляет механизм, называемый сериализацией.
Поэтому, если мы сериализовали объект, его можно прочитать и деактивировать через тип объекта и другую информацию, и, наконец, получает прототип объекта.
Объекты ObjectInputStream и ObjectOutputStream представляют собой потоковые объекты с высоким уровнем уровня, включая сериализацию и последовательные методы.
ObjectOutputStream имеет много методов для сериализованных объектов.
Private void writebject (objectOutputStream OS) бросает ioException {}
Подобный ObjectInputStream предоставляет следующие методы:
Private void Brand (ObjectInputStream IS) бросает ioException, classnotfoundexception {}
Итак, где это нужно быть сериализованным? Сериализация обычно использует данные о передаче сети или сохраняет объекты в файлах. Данные, упомянутые здесь, являются объектом, а не текстом.
Теперь проблема в том, что наша сетевая архитектура и жесткий диск могут идентифицировать только бинарные и байты и не могут распознать объекты Java.
Сериализация должна перевести значение/состояния в объект Java в байты для передачи или сохранения через сеть. Кроме того, сериализация зависимостей состоит в том, чтобы прочитать код байта и перевести его обратно в объект Java.
Концепция SerialVersionUid
SerialVersionUID используется для обеспечения того же объекта (который может использоваться в сериализации), который может быть загружен во время процесса десериализации. SerialVersionUid - это управление версией для объектов. Вы можете обратиться к сериализации SerialVersionUID в сериализации Java, чтобы получить больше информации.
Для сериализации:
Шаги следующие:
Посмотрим список:
Создать сотрудники. Java в src-> org.arpit.javapostsforning
1.Employee.java
Пакет org.arpit.javapostsforning; = Employeeid;} public String getEmployeEname () {return employeeEname;} public void setEmployeEname (string urpoyeename) {this.employeena me = usmenteename;} public String getDeppartment () {return Department;} public void setDepment (String Department) {this. Depapartment = department;}}
Как вы можете видеть, если вам нужно сериализовать любой класс, то вы должны реализовать сериализуемый интерфейс.
Интерфейс маркера в Java - это интерфейс без какого -либо поля или метода.
2.serializemain.java
Пакет org.arpit.javapostsforning; ] Args) {employee emp = new Employee (); ser "); objectPutStream Outstream = new ObjectPutStream (fileOut); upstream.writeObject (emp); upstream.close (); Exception i) {i.printStackTrace ();}}}
Для обратной последовательности:
Шаг есть
В пакете src-> org.arpit.javapostsforlearning, создайте deserializemain.java
3. deserializemain.java
Package org.arpit.javapostsforning; Null; Ioexception i) {i.printstacktrace (); ... "); System.out.println (" emp Id: " + emp.getEmployeeid ()); system.out.println (" name: " + emp.getemployeEname ()); stem.out.println (" Отдел: " + emp.getDeppartment ());}}
4. запустить:
Сначала запустите serializemain.java, а затем запустите deserializemain.java, вы получите следующие результаты:
Deserialized Emblayee ... Emp Id: 101name: Arpitdepapartment: CS
Таким образом, мы сериализовали объект сотрудника и выполнили его. Это выглядит просто, но если оно содержит ссылки на объекты и наследство, ситуация станет сложной. Давайте посмотрим на примеры один за другим, чтобы увидеть, как добиться сериализации в различных случаях.
Случай 1 -Если объект цитирует другие объекты, что мне делать
Мы уже видели самые простые примеры на основе последовательности. Как мы можем сериализовать? Будет ли цитируемый объект также сериализовать? Да, вам не нужно явно сериализовано. Когда вы сериализуете любой объект, если он содержит эталонные объекты, то сериализация Java автоматически сериализует всю диаграмму объектов объекта. Например, сотрудник теперь цитирует объект адреса, а адрес также цитирует другие объекты (например, дом), а затем, когда вы сериализуете объект сотрудника, все другие цитируемые объекты, такие как адрес и дом, будут автоматически сериализированы сериализацией Давайте создадим класс адреса и добавим объект адреса в качестве ссылки, чтобы добавить его в класс сотрудников.
Сотрудник. Java:
Пакет org.arpit.javapostsforning; This.employeeid = employeeid;} public String getEmployeEname () {return employeeeEname;} public void setempoloyeename (string hopecteename) {this.emplayeename = employeeeName;} public String getDeppartment () {return Department;} public void setDeppartment (строковое отделение) { This.department = department;} public Adder getAddress () {return Address;} public void setAddress (адрес Адрес) {this.address = адрес;
В org.arpit.javapostsforlerning пакет, создать адрес.java
Address.java:
Пакет Org.arpit.javapostsforning; this .city = city;} public int gethomeno () {return homeno;} public void sethomeno (int home) {this.homeno = homeno;} public StringStstreet () {street;} public void setstreet (String Street) {this. Street = Street;} public String getCity () {return City;} public void setCity (String City) {this.city = city;}}
В org.arpit.javapostsforlerning создать сериализованный заводчик
Serializedeserializemain.java:
Пакет org.arpit.javapostsforning; Mandliya */ public void main (string [] args) {employee emp = new Employee (); 88, "MG Road", "Pune"); Close ();} Catch (ioException i) {i.printStackTrace ();} /Deserialize EMP = L; (Сотрудник) in.reamobject (); Deserialized Employee ... "); System .out.println (" emp Id: " + emp.getEmployeeid ()); System.out.println (" name: " + emp.getEmployeEname ()); mp.getDepartment () );
Запустить это:
Когда вы запускаете serializedeserializemain.java. Вы получите такой результат:
java.io.notserializableException: org.arpit.javapostsforning.address на java.io.objectputtream.writeobject0 (неизвестный источник) на java.i o.objectputstream.defaultwritefields (неизвестный источник) на java.io.objectputtream.writeShirdATATATARITERILDATATARILEDATARITERILDS (UNTONKIN в java.io.objectputstream.writeordinarybject (неизвестный источник) на java.io.objectputtream.writeobject0 (неизвестный источник) на java.io.ob.ob jectoutputstream.writeobject (неизвестный источник)
Мы объясним, где это неправильно. Я забыл сказать, что адресной класс также должен быть сериализуем. Затем адресный класс должен наследовать сериалевой интерфейс.
Address.java:
Импорт java.io.serializable; .City = city;} public int gethomeno () {return homeno;} public void sethomeno (int homeno) {this.homeno = homeno;} public StringStreet () {) return Street;} public void setstreet (String Street) {this .Street = Street;} public String getCity () {return City;} public void setCity (String City) {this.city = city;}}}
Беги снова:
Когда вы снова бегите serializedeserializemain.java. Вы можете получить следующие результаты
Deserialized Emblayee ... Emp Id: 101name: Arpitdepartment: Cscity: Pune
Случай 2: Если мы не можем получить доступ к исходному коду справочного объекта (например, вы не можете получить доступ к исходному коду адресного класса выше)
Если мы не можем получить доступ к классу адреса, как мы можем реализовать сериализуемый интерфейс в адресном классе? Есть ли другой способ достичь этого? Да, вы можете создать еще один класс, наследовать адрес, а затем позволить ему унаследовать сериализуемый интерфейс, но для следующей ситуации это решение потерпит неудачу:
Если эталонный класс определяется как окончательный
Если ссылочный класс ссылается на другой неэриализованный объект
Итак, как мы можем сериализовать объект сотрудника? Решение состоит в том, чтобы отметить переход. Если вам не нужно сериализовать какое -либо поле, просто отметьте его как переходное.
Переходный адрес адреса
В классе сотрудников, после того, как адрес помечен как переходный процесс, запустите программу. Вы получите NullPointerException, потому что ссылка на адрес будет нулевой в процессе глубокого.
Случай 3 -Что, если мне все еще нужно сохранить состояние эталонного объекта? (Например, объект адреса)
Если вы пометили адрес как временный процесс в процессе Deepertine, он вернет нулевый результат. Но если вам все еще нужно сохранить его состояние, вам нужно сериализовать объект адреса. Java Serialization обеспечивает механизм.
Сотрудник. Java:
Пакет org.arpit.javapostsforning; Адрес; ;} Public String getDepApartment () {return Department;} public void setDepartment (String Department)} public Address getAddress () {return addres OS) бросает ioException, classnotfoundexception {try {os.defaultwriteObject (); ;}} Private void readoBject (ObjectInputStream IS) бросает ioExcation sudexception {try {is.defaultreadobject (); .ReadObject ();
Еще одна вещь, которую следует помнить, ObjectInputStream считывает порядок данных от ObjectOutputStream.
Создать адрес.java
Address.java:
Пакет org.arpit.javapostsforning; = Street; This.street = Street;} public String getCity () {return City;} public void setCity (String City) {this.city = city;
Создать serializedeserializemain.java
Serializedeserializemain.java:
Пакет org.arpit.javapostsforning; Mandliya */ public void main (string [] args) {employee emp = new Employee (); 88, "MG Road", "Pune"); Close ();} Catch (ioException i) {i.printStackTrace ();} /Deserialize EMP = L; (Сотрудник) in.reamobject (); Deserialized Employee ... "); System .out.println (" emp Id: " + emp.getEmployeeid ()); System.out.println (" name: " + emp.getEmployeEname ()); mp.getDepartment () );
бегать:
Когда вы запускаете serializedeserializemain.java.
Deserialized Emblayee ... Emp Id: 101name: Arpitdepartment: Cscity: Pune
Теперь мы получаем состояние объекта адреса, точно так же, как он, прежде чем он будет сериализован.
Наследование в сериализации:
Теперь давайте посмотрим, как наследование влияет на сериализацию. Независимо от того, является ли родительский класс сериализован, это приведет ко многим примерам. Если родительский класс не сериализован, что мы будем делать и как он работает. Давайте посмотрим на пример.
Мы создадим человека. Ява как родительский класс сотрудников.
Случай 4: Если родительский класс сериализован
Если родительский класс может сериализовать, все классы наследования будут сериализованы.
Случай 5: Что, если родительский класс не сериализован?
Если родительский класс не является сериализованным, наши методы обработки будут очень разными.
Если родительский класс неэраализован, он не должен иметь функцию конструктора параметров.
Человек. Ява
Org.arpit.javapostsforning; Super (); ;} Public void setnationality (String atationality) {this.nationality = nationality;}}
Создать сотрудник. Java
Сотрудник. Java:
Пакет org.arpit.javapostsforning; .employeeid = employeeid; Department;} public void setDeppartment (String Department) {this.deppartment = Department;}}
Создать serializedeserializemain.java
Serializedeserializemain.java:
Пакет org.arpit.javapostsforning; Mandliya */public void main (string [] args) {// serialize employeee emp = новый сотрудник (101, "Arpit", "Indian"); .println ("emp Id:" + emp.getEmployeid ()); getDeppartment ()); ); *********** ");) ;; try {fileInputStream filein = new FileInputStream (" employeee.ser ");) in.readobject (); in.close (); filein.close () ;} Catch (ioException i) {i.printstacktrace (); («После сериализации»); «Отдел:» + emp.getDeppartment ());
бегать:
Когда вы запускаете serializedeserializemain.java, вы получите следующий выход. Здесь имя унаследовано лично, поэтому в процессе глубокого инициализация будет инициализировано до значения по умолчанию.
Случай 6 -Если родительский класс сериализован, но вам не нужно наследовать класс как сериализованный
Если вы не хотите наследовать класс для сериализации, вам необходимо реализовать методы writeobject () и readobject () и необходимо выбрасывать аномалия notserializableException.
Случай 7 -может сериализовать статические переменные?
не может. Поскольку статические переменные являются уровнями класса, а не уровнями объекта.
Суммировать: