Статьи

Сериализация в Java

Java предоставляет механизм, называемый сериализацией, для сохранения Java-объектов в форме упорядоченных или последовательных байтов, которые включают в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте. Поэтому, если мы сериализовали какой-либо объект, его можно прочитать и десериализовать, используя тип объекта и другую информацию, чтобы мы могли извлечь исходный объект.

Классы ObjectInputStream и ObjectOutputStream являются потоками высокого уровня, которые содержат методы для сериализации и десериализации объекта. ObjectOutputStream имеет много методов для сериализации объекта, но обычно используется метод:

1
2
3
4
private void writeObject(ObjectOutputStream os) throws IOException
{
 
}

Точно так же ObjectInputStream имеет

1
2
3
4
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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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, и вы получите следующий вывод:

1
2
3
4
Deserialized Employee...
Emp id: 101
Name: Arpit
Department: CS

Таким образом, мы сериализовали объект сотрудника, а затем десериализовали его. Это кажется очень простым, но это может быть очень сложно, когда эталонный объект, наследование входят в картину. Таким образом, мы увидим разные случаи один за другим и как мы можем применить сериализацию в разных сценариях. ,

Случай 1 — Что делать, если объект имеет ссылку на другие объекты

Мы видели очень простой случай сериализации, что теперь, если он также является ссылкой на другие объекты. Как он будет сериализован? будет ли сериализован ссылочный объект? Да, вам не нужно явно сериализовать ссылочные объекты. Когда вы сериализуете какой-либо объект и если он содержит любую другую ссылку на объект, Java-сериализация сериализует весь граф объекта этого объекта.

Например: допустим, у Employee теперь есть ссылка на объект address, а Address может иметь ссылку на какой-то другой объект (например, Home), тогда при сериализации объекта Employee все другие ссылочные объекты, такие как адрес и home, будут автоматически сериализованы. Давайте создадим класс Address и добавим объект Address в качестве ссылки на вышеуказанный класс сотрудников.

Employee.java:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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. Вы получите следующий вывод:

1
2
3
4
5
6
7
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:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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. Вы получите следующий вывод:

1
2
3
4
5
Deserialized Employee... 
Emp id: 101 
Name: Arpit 
Department: CS 
City: Pune

Случай 2. Что если у вас нет доступа к исходному коду ссылочного объекта (например, у вас нет доступа к вышеуказанному классу Address)

Если у вас нет доступа к классу адресов, то как вы реализуете сериализуемый интерфейс в классе адресов. Есть ли альтернатива этому? да, есть, вы можете создать другой класс, который расширяет адрес и делает его сериализуемым, но он может давать сбой во многих случаях:

  • Что если класс объявлен как final
  • Что, если у класса есть ссылка на другой не сериализуемый объект.

Итак, как вы будете сериализовать объект Employee? Таким образом, решение заключается в том, что вы можете сделать его временным. Если вы не хотите сериализовать какое-либо поле, сделайте его временным.

1
transient Address address

Таким образом, после выполнения перехода в классе Employee при запуске программы вы получите nullPointerException, поскольку во время десериализации ссылка на адрес будет нулевой

Случай 3: Что делать, если вы все еще хотите сохранить состояние ссылочного объекта (например, объекта адреса выше):

Если вы сделаете адрес временным, то во время десериализации он вернет null. Но что, если вы все еще хотите иметь то же состояние, что и при сериализации объекта адреса. Сериализация Java обеспечивает механизм, такой, что если у вас есть закрытые методы с определенной сигнатурой, они получат вызывается во время сериализации и десериализации, поэтому мы переопределим методы writeObject и readObject класса employee, и они будут вызваны во время сериализации и десериализации объекта Employee.

Employee.java:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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:

Address.java:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package org.arpit.javapostsforlearning;
import java.io.Serializable;
 
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:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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. Вы получите следующий вывод:

1
2
3
4
5
Deserialized Employee...
Emp id: 101
Name: Arpit
Department: CS
City :Pune

так что теперь мы получили то же состояние объекта адреса, что и до сериализации.

Наследование в сериализации:

Теперь мы увидим, как наследование влияет на сериализацию. Так что может быть несколько случаев, является ли суперкласс сериализуемым или нет. Если нет, то как вы с этим справитесь и как это работает. Мы создадим Person.java, который будет суперклассом Employee:

Случай 4: что если суперкласс является сериализуемым?

Если суперкласс сериализуем, то все его подклассы автоматически сериализуются.

Случай 5: что делать, если суперкласс не сериализуем?

Если суперкласс не сериализуем, тогда мы должны обращаться с ним по-другому.

  • Если суперкласс не сериализуем, тогда у него не должно быть аргумента конструктора.

Person.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package org.arpit.javapostsforlearning;
public class Person {
 
 String name='default';
 String nationality;
 
 public Person()
 {
  System.out.println('Person:Constructor');
 }
 
 public Person(String name, String nationality) {
  super();
  this.name = name;
  this.nationality = nationality;
 }
 
 public String getName() {
  return name;
 }
 
 public void setName(String name) {
  this.name = name;
 }
 
 public String getNationality() {
  return nationality;
 }
 
 public void setNationality(String nationality) {
  this.nationality = nationality;
 }
 
}

Создайте Employee.java в org.arpit.javapostsforlearning:

Employee.java:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package org.arpit.javapostsforlearning;
import java.io.Serializable;
 
public class Employee extends Person implements Serializable{
 
 int employeeId;
 String department;
 
 public Employee(int employeeId,String name,String department,String nationality)
 {
  super(name,nationality);
  this.employeeId=employeeId;
  this.department=department;
  System.out.println('Employee:Constructor');
 }
 
 public int getEmployeeId() {
  return employeeId;
 }
 public void setEmployeeId(int employeeId) {
  this.employeeId = employeeId;
 }
 
 public String getDepartment() {
  return department;
 }
 public void setDepartment(String department) {
  this.department = department;
 }
}

Создайте SerializeDeserializeMain.java в org.arpit.javapostsforlearning:

SerializeDeserializeMain.java:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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) {
 
  //Serialize
  Employee emp = new Employee(101,'Arpit','CS','Indian');
  System.out.println('Before serializing');
  System.out.println('Emp id: ' + emp.getEmployeeId());
  System.out.println('Name: ' + emp.getName());
  System.out.println('Department: ' + emp.getDepartment());
  System.out.println('Nationality: ' + emp.getNationality());
  System.out.println('************');
  System.out.println('Serializing');
  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
  System.out.println('************');
  System.out.println('Deserializing');
  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('After serializing');
  System.out.println('Emp id: ' + emp.getEmployeeId());
  System.out.println('Name: ' + emp.getName());
  System.out.println('Department: ' + emp.getDepartment());
  System.out.println('Nationality: ' + emp.getNationality());
 }
}

Запустить его :

Когда вы запустите SerializeDeserializeMain.java. Вы получите следующий вывод:

Если суперкласс не Serializable, то все значения переменных экземпляра, унаследованные от суперкласса, будут инициализированы вызовом конструктора несериализуемого суперкласса в процессе десериализации. Таким образом, здесь имя наследуется от лица, поэтому во время десериализации имя инициализируется по умолчанию.

Случай 6 — Что, если суперкласс Serializable, но вы не хотите, чтобы подкласс был Serializable

Если вы не хотите, чтобы подкласс был сериализуемым, вам нужно реализовать методы writeObject () и readObject (), а также исключить исключение NotSerializableException из этих методов.

Случай 7 — Можете ли вы сериализовать статические переменные?

Нет, вы не можете. Как вы знаете, статические переменные находятся на уровне класса, а не на уровне объекта, и вы сериализуете объект, поэтому вы не можете сериализовать статические переменные.

Резюме:

  • Сериализация — это перевод значений / состояний вашего Java-объекта в байты для его отправки по сети или сохранения. С другой стороны, десериализация — это преобразование байтового кода в соответствующие объекты Java.
  • В сериализации хорошо то, что весь процесс независим от JVM, то есть объект можно сериализовать на одной платформе и десериализовать на совершенно другой платформе. \
  • Если вы хотите сериализовать любой класс, он должен реализовать интерфейс Serializable, который является интерфейсом маркера.
  • Интерфейс маркера в Java — это интерфейс без поля или методов, или в простом слове пустой интерфейс в Java называется интерфейсом маркера
  • serialVersionUID используется, чтобы гарантировать, что тот же самый объект (который использовался во время Сериализации) загружен во время Deserialization.serialVersionUID используется для контроля версии объекта.
  • Когда вы сериализуете любой объект и если он содержит любую другую ссылку на объект, Java-сериализация сериализует весь граф объекта этого объекта.
  • Если вы не хотите сериализовать какое-либо поле, сделайте его переходным.
  • Если суперкласс Serializable, то его подклассы автоматически Serializable.
  • Если суперкласс не Serializable, то все значения переменных экземпляра, унаследованные от суперкласса, будут инициализированы вызовом конструктора несериализуемого суперкласса в процессе десериализации.
  • Если вы не хотите, чтобы подкласс был сериализуемым, вам нужно реализовать методы writeObject () и readObject (), а также исключить исключение NotSerializableException из этих методов.
  • Вы не можете сериализовать статические переменные.

Ссылка: Сериализация в java от нашего партнера JCG Арпит Мандлия в рамках Java-фреймворков и шаблонов проектирования для начинающих .