Java предоставляет механизм, называемый сериализацией, для сохранения Java-объектов в форме упорядоченных или последовательных байтов, которые включают в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте. Поэтому, если мы сериализовали какой-либо объект, его можно прочитать и десериализовать, используя тип объекта и другую информацию, чтобы мы могли извлечь исходный объект
Классы ObjectInputStream и ObjectOutputStream являются потоками высокого уровня, которые содержат методы для сериализации и объекта. ObjectOutputStream имеет много методов для сериализации объекта, но обычно используется метод:
private void writeObject(ObjectOutputStream os) throws IOException
{
}
Точно так же ObjectInputStream имеет
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException
{
}
Нужна сериализация?
Сериализация обычно используется, когда возникает необходимость отправить ваши данные по сети или хранятся в файлах. Под данными я подразумеваю объекты, а не текст. Теперь проблема заключается в том, что ваша сетевая инфраструктура и ваш жесткий диск являются аппаратными компонентами, которые понимают биты и байты, но не объекты Java. Сериализация – это перевод значений / состояний вашего Java-объекта в байты для его отправки по сети или сохранения. С другой стороны, десериализация – это преобразование байтового кода в соответствующие объекты Java.
Концепция serialVersionUID:
SerialVersionUID используется, чтобы гарантировать, что тот же самый объект (который использовался во время Сериализации) загружен во время Deserialization.serialVersionUID используется для контроля версии объекта. Вы можете прочитать больше в serialVersionUID в сериализации Java
Для сериализации:
Шаги:
Давайте рассмотрим пример: создайте Employee.java в src-> org.arpit.javapostsforlearning:
1.Employee.java
package org.arpit.javapostsforlearning;
import java.io.Serializable;
public class Employee implements Serializable{
int employeeId;
String employeeName;
String department;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
Как вы можете видеть выше, если вы хотите сериализовать какой-либо класс, он должен реализовать интерфейс Serializable, который является интерфейсом маркера.
Маркерный интерфейс в Java – это интерфейсы без полей или методов, или в простом слове пустой интерфейс в Java называется маркерным интерфейсом. Создайте SerializeMain.java в src-> org.arpit.javapostsforlearning
2.SerializeMain.java
package org.arpit.javapostsforlearning;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializeMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Employee emp = new Employee();
emp.setEmployeeId(101);
emp.setEmployeeName('Arpit');
emp.setDepartment('CS');
try
{
FileOutputStream fileOut = new FileOutputStream('employee.ser');
ObjectOutputStream outStream = new ObjectOutputStream(fileOut);
outStream.writeObject(emp);
outStream.close();
fileOut.close();
}catch(IOException i)
{
i.printStackTrace();
}
}
}
Для десериализации:
Шаги:
Создайте DeserializeMain.java в src-> org.arpit.javapostsforlearning
3.DeserializeMain.java
package org.arpit.javapostsforlearning;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializeMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Employee emp = null;
try
{
FileInputStream fileIn =new FileInputStream('employee.ser');
ObjectInputStream in = new ObjectInputStream(fileIn);
emp = (Employee) in.readObject();
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println('Employee class not found');
c.printStackTrace();
return;
}
System.out.println('Deserialized Employee...');
System.out.println('Emp id: ' + emp.getEmployeeId());
System.out.println('Name: ' + emp.getEmployeeName());
System.out.println('Department: ' + emp.getDepartment());
}
}
4. Запустите это:
Сначала запустите SerializeMain.java, затем DeserializeMain.java, и вы получите следующий вывод:
Deserialized Employee...
Emp id: 101
Name: Arpit
Department: CS
Таким образом, мы сериализовали объект сотрудника, а затем десериализовали его. Это кажется очень простым, но это может быть очень сложно, когда эталонный объект, наследование входят в картину. Таким образом, мы увидим разные случаи один за другим и как мы можем применить сериализацию в разных сценариях.
Случай 1 – Что делать, если объект имеет ссылку на другие объекты
Мы видели очень простой случай сериализации, что теперь, если он также является ссылкой на другие объекты. Как он будет сериализован? будет ли сериализован ссылочный объект? Да, вам не нужно явно сериализовать ссылочные объекты. Когда вы сериализуете какой-либо объект и если он содержит любую другую ссылку на объект, Java-сериализация сериализует весь граф объекта этого объекта.
Например: допустим, у Employee теперь есть ссылка на объект address, а Address может иметь ссылку на какой-то другой объект (например, Home), тогда при сериализации объекта Employee все другие ссылочные объекты, такие как адрес и home, будут автоматически сериализованы. Давайте создадим класс Address и добавим объект Address в качестве ссылки на вышеуказанный класс сотрудников.
Employee.java:
package org.arpit.javapostsforlearning;
import java.io.Serializable;
public class Employee implements Serializable{
int employeeId;
String employeeName;
String department;
Address address;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Создайте Address.java в org.arpit.javapostsforlearning:
Address.java:
package org.arpit.javapostsforlearning;
public class Address {
int homeNo;
String street;
String city;
public Address(int homeNo, String street, String city) {
super();
this.homeNo = homeNo;
this.street = street;
this.city = city;
}
public int getHomeNo() {
return homeNo;
}
public void setHomeNo(int homeNo) {
this.homeNo = homeNo;
}
public String getStreet() {
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 в org.arpit.javapostsforlearning:
SerializeDeserializeMain.java:
package org.arpit.javapostsforlearning;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeDeserializeMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Employee emp = new Employee();
emp.setEmployeeId(101);
emp.setEmployeeName('Arpit');
emp.setDepartment('CS');
Address address=new Address(88,'MG road','Pune');
emp.setAddress(address);
//Serialize
try
{
FileOutputStream fileOut = new FileOutputStream('employee.ser');
ObjectOutputStream outStream = new ObjectOutputStream(fileOut);
outStream.writeObject(emp);
outStream.close();
fileOut.close();
}catch(IOException i)
{
i.printStackTrace();
}
//Deserialize
emp = null;
try
{
FileInputStream fileIn =new FileInputStream('employee.ser');
ObjectInputStream in = new ObjectInputStream(fileIn);
emp = (Employee) in.readObject();
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println('Employee class not found');
c.printStackTrace();
return;
}
System.out.println('Deserialized Employee...');
System.out.println('Emp id: ' + emp.getEmployeeId());
System.out.println('Name: ' + emp.getEmployeeName());
System.out.println('Department: ' + emp.getDepartment());
address=emp.getAddress();
System.out.println('City :'+address.getCity());
}
}
Запустить его :
Когда вы запустите SerializeDeserializeMain.java. Вы получите следующий вывод:
java.io.NotSerializableException: org.arpit.javapostsforlearning.Address
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
Мы получили исключение, что пошло не так. Я забыл упомянуть, класс Address также должен быть сериализуемым. Так что вам нужно сделать сериализуемый Address, реализуя интерфейс serialzable.
Address.java:
import java.io.Serializable;
public class Address implements Serializable{
int homeNo;
String street;
String city;
public Address(int homeNo, String street, String city) {
super();
this.homeNo = homeNo;
this.street = street;
this.city = city;
}
public int getHomeNo() {
return homeNo;
}
public void setHomeNo(int homeNo) {
this.homeNo = homeNo;
}
public String getStreet() {
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 Employee...
Emp id: 101
Name: Arpit
Department: CS
City: Pune
Случай 2. Что если у вас нет доступа к исходному коду ссылочного объекта (например, у вас нет доступа к вышеуказанному классу Address)
Если у вас нет доступа к классу адресов, то как вы реализуете сериализуемый интерфейс в классе адресов. Есть ли альтернатива этому? да, есть, вы можете создать другой класс, который расширяет адрес и делает его сериализуемым, но он может давать сбой во многих случаях:
- Что если класс объявлен как final
- Что, если у класса есть ссылка на другой не сериализуемый объект.
Итак, как вы будете сериализовать объект Employee? Таким образом, решение заключается в том, что вы можете сделать его временным. Если вы не хотите сериализовать какое-либо поле, сделайте его временным.
transient Address address
Таким образом, после выполнения перехода в классе Employee при запуске программы вы получите nullPointerException, поскольку во время десериализации ссылка на адрес будет нулевой
Случай 3: Что делать, если вы все еще хотите сохранить состояние ссылочного объекта (например, объекта адреса выше):
Если вы сделаете адрес временным, то во время десериализации он вернет null. Но что, если вы все еще хотите иметь то же состояние, что и при сериализации объекта адреса. Сериализация Java обеспечивает механизм, такой, что если у вас есть закрытые методы с определенной сигнатурой, они получат вызывается во время сериализации и десериализации, поэтому мы переопределим методы writeObject и readObject класса employee, и они будут вызваны во время сериализации и десериализации объекта Employee.
Employee.java:
package org.arpit.javapostsforlearning;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Employee implements Serializable{
int employeeId;
String employeeName;
String department;
transient Address address;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
private void writeObject(ObjectOutputStream os) throws IOException, ClassNotFoundException
{
try {
os.defaultWriteObject();
os.writeInt(address.getHomeNo());
os.writeObject(address.getStreet());
os.writeObject(address.getCity());
}
catch (Exception e)
{ e.printStackTrace(); }
}
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException
{
try {
is.defaultReadObject();
int homeNo=is.readInt();
String street=(String) is.readObject();
String city=(String) is.readObject();
address=new Address(homeNo,street,city);
} catch (Exception e) { e.printStackTrace(); }
}
}
Следует иметь в виду, что ObjectInputStream должен считывать данные в той же последовательности, в которой мы записали данные в ObjectOutputStream. Создайте Address.java в org.arpit.javapostsforlearning:Классы ObjectInputStream и ObjectOutputStream являются потоками высокого уровня, которые содержат методы для сериализации и объекта. ObjectOutputStream имеет много методов для сериализации объекта, но обычно используется метод:
private void writeObject(ObjectOutputStream os) throws IOException
{
}
Точно так же ObjectInputStream имеет
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException
{
}
Нужна сериализация?
Сериализация обычно используется, когда возникает необходимость отправить ваши данные по сети или хранятся в файлах. Под данными я подразумеваю объекты, а не текст. Теперь проблема заключается в том, что ваша сетевая инфраструктура и ваш жесткий диск являются аппаратными компонентами, которые понимают биты и байты, но не объекты Java. Сериализация – это перевод значений / состояний вашего Java-объекта в байты для его отправки по сети или сохранения. С другой стороны, десериализация – это преобразование байтового кода в соответствующие объекты Java.
Концепция serialVersionUID:
SerialVersionUID используется, чтобы гарантировать, что тот же самый объект (который использовался во время Сериализации) загружен во время Deserialization.serialVersionUID используется для контроля версии объекта. Вы можете прочитать больше в serialVersionUID в сериализации Java
Для сериализации:
Шаги:
Давайте рассмотрим пример: создайте Employee.java в src-> org.arpit.javapostsforlearning:
1.Employee.java
package org.arpit.javapostsforlearning;
import java.io.Serializable;
public class Employee implements Serializable{
int employeeId;
String employeeName;
String department;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
Как вы можете видеть выше, если вы хотите сериализовать какой-либо класс, он должен реализовать интерфейс Serializable, который является интерфейсом маркера.
Маркерный интерфейс в Java – это интерфейсы без полей или методов, или в простом слове пустой интерфейс в Java называется маркерным интерфейсом. Создайте SerializeMain.java в src-> org.arpit.javapostsforlearning
2.SerializeMain.java
package org.arpit.javapostsforlearning;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializeMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Employee emp = new Employee();
emp.setEmployeeId(101);
emp.setEmployeeName('Arpit');
emp.setDepartment('CS');
try
{
FileOutputStream fileOut = new FileOutputStream('employee.ser');
ObjectOutputStream outStream = new ObjectOutputStream(fileOut);
outStream.writeObject(emp);
outStream.close();
fileOut.close();
}catch(IOException i)
{
i.printStackTrace();
}
}
}
Для десериализации:
Шаги:
Создайте DeserializeMain.java в src-> org.arpit.javapostsforlearning
3.DeserializeMain.java
package org.arpit.javapostsforlearning;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializeMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Employee emp = null;
try
{
FileInputStream fileIn =new FileInputStream('employee.ser');
ObjectInputStream in = new ObjectInputStream(fileIn);
emp = (Employee) in.readObject();
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println('Employee class not found');
c.printStackTrace();
return;
}
System.out.println('Deserialized Employee...');
System.out.println('Emp id: ' + emp.getEmployeeId());
System.out.println('Name: ' + emp.getEmployeeName());
System.out.println('Department: ' + emp.getDepartment());
}
}
4. Запустите это:
Сначала запустите SerializeMain.java, затем DeserializeMain.java, и вы получите следующий вывод:
Deserialized Employee...
Emp id: 101
Name: Arpit
Department: CS
Таким образом, мы сериализовали объект сотрудника, а затем десериализовали его. Это кажется очень простым, но это может быть очень сложно, когда эталонный объект, наследование входят в картину. Таким образом, мы увидим разные случаи один за другим и как мы можем применить сериализацию в разных сценариях.
Случай 1 – Что делать, если объект имеет ссылку на другие объекты
Мы видели очень простой случай сериализации, что теперь, если он также является ссылкой на другие объекты. Как он будет сериализован? будет ли сериализован ссылочный объект? Да, вам не нужно явно сериализовать ссылочные объекты. Когда вы сериализуете какой-либо объект и если он содержит любую другую ссылку на объект, Java-сериализация сериализует весь граф объекта этого объекта.
Например: допустим, у Employee теперь есть ссылка на объект address, а Address может иметь ссылку на какой-то другой объект (например, Home), тогда при сериализации объекта Employee все другие ссылочные объекты, такие как адрес и home, будут автоматически сериализованы. Давайте создадим класс Address и добавим объект Address в качестве ссылки на вышеуказанный класс сотрудников.
Employee.java:
package org.arpit.javapostsforlearning;
import java.io.Serializable;
public class Employee implements Serializable{
int employeeId;
String employeeName;
String department;
Address address;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Создайте Address.java в org.arpit.javapostsforlearning:
Address.java:
package org.arpit.javapostsforlearning;
public class Address {
int homeNo;
String street;
String city;
public Address(int homeNo, String street, String city) {
super();
this.homeNo = homeNo;
this.street = street;
this.city = city;
}
public int getHomeNo() {
return homeNo;
}
public void setHomeNo(int homeNo) {
this.homeNo = homeNo;
}
public String getStreet() {
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 в org.arpit.javapostsforlearning:
SerializeDeserializeMain.java:
package org.arpit.javapostsforlearning;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeDeserializeMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Employee emp = new Employee();
emp.setEmployeeId(101);
emp.setEmployeeName('Arpit');
emp.setDepartment('CS');
Address address=new Address(88,'MG road','Pune');
emp.setAddress(address);
//Serialize
try
{
FileOutputStream fileOut = new FileOutputStream('employee.ser');
ObjectOutputStream outStream = new ObjectOutputStream(fileOut);
outStream.writeObject(emp);
outStream.close();
fileOut.close();
}catch(IOException i)
{
i.printStackTrace();
}
//Deserialize
emp = null;
try
{
FileInputStream fileIn =new FileInputStream('employee.ser');
ObjectInputStream in = new ObjectInputStream(fileIn);
emp = (Employee) in.readObject();
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println('Employee class not found');
c.printStackTrace();
return;
}
System.out.println('Deserialized Employee...');
System.out.println('Emp id: ' + emp.getEmployeeId());
System.out.println('Name: ' + emp.getEmployeeName());
System.out.println('Department: ' + emp.getDepartment());
address=emp.getAddress();
System.out.println('City :'+address.getCity());
}
}
Запустить его :
Когда вы запустите SerializeDeserializeMain.java. Вы получите следующий вывод:
java.io.NotSerializableException: org.arpit.javapostsforlearning.Address
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
Мы получили исключение, что пошло не так. Я забыл упомянуть, класс Address также должен быть сериализуемым. Так что вам нужно сделать сериализуемый Address, реализуя интерфейс serialzable.
Address.java:
import java.io.Serializable;
public class Address implements Serializable{
int homeNo;
String street;
String city;
public Address(int homeNo, String street, String city) {
super();
this.homeNo = homeNo;
this.street = street;
this.city = city;
}
public int getHomeNo() {
return homeNo;
}
public void setHomeNo(int homeNo) {
this.homeNo = homeNo;
}
public String getStreet() {
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 Employee...
Emp id: 101
Name: Arpit
Department: CS
City: Pune
Случай 2. Что если у вас нет доступа к исходному коду ссылочного объекта (например, у вас нет доступа к вышеуказанному классу Address)
Если у вас нет доступа к классу адресов, то как вы реализуете сериализуемый интерфейс в классе адресов. Есть ли альтернатива этому? да, есть, вы можете создать другой класс, который расширяет адрес и делает его сериализуемым, но он может давать сбой во многих случаях:
- Что если класс объявлен как final
- Что, если у класса есть ссылка на другой не сериализуемый объект.
Итак, как вы будете сериализовать объект Employee? Таким образом, решение заключается в том, что вы можете сделать его временным. Если вы не хотите сериализовать какое-либо поле, сделайте его временным.
transient Address address
Таким образом, после выполнения перехода в классе Employee при запуске программы вы получите nullPointerException, поскольку во время десериализации ссылка на адрес будет нулевой
Случай 3: Что делать, если вы все еще хотите сохранить состояние ссылочного объекта (например, объекта адреса выше):
Если вы сделаете адрес временным, то во время десериализации он вернет null. Но что, если вы все еще хотите иметь то же состояние, что и при сериализации объекта адреса. Сериализация Java обеспечивает механизм, такой, что если у вас есть закрытые методы с определенной сигнатурой, они получат вызывается во время сериализации и десериализации, поэтому мы переопределим методы writeObject и readObject класса employee, и они будут вызваны во время сериализации и десериализации объекта Employee.
Employee.java:
package org.arpit.javapostsforlearning;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Employee implements Serializable{
int employeeId;
String employeeName;
String department;
transient Address address;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
private void writeObject(ObjectOutputStream os) throws IOException, ClassNotFoundException
{
try {
os.defaultWriteObject();
os.writeInt(address.getHomeNo());
os.writeObject(address.getStreet());
os.writeObject(address.getCity());
}
catch (Exception e)
{ e.printStackTrace(); }
}
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException
{
try {
is.defaultReadObject();
int homeNo=is.readInt();
String street=(String) is.readObject();
String city=(String) is.readObject();
address=new Address(homeNo,street,city);
} catch (Exception e) { e.printStackTrace(); }
}
}
Следует иметь в виду, что ObjectInputStream должен считывать данные в той же последовательности, в которой мы записали данные в ObjectOutputStream. Создайте Address.java в org.arpit.javapostsforlearning: