Java serialization for extended class

In the java serialization class, Mp3player extends ElectronicDevice. The top-class supercomputer serialized in this code is not serializable. here the superclass also becomes serialized. my understanding of the super class is also serialized due to extends.let i know my understanding is correct or not.

import java.io.*; class ElectronicDevice { ElectronicDevice() { System.out.print("ed "); } } class Mp3player extends ElectronicDevice implements Serializable { Mp3player() { System.out.print("mp "); } } class MiniPlayer extends Mp3player { MiniPlayer() { System.out.print("mini "); } public static void main(String[] args) { MiniPlayer m = new MiniPlayer(); try { FileOutputStream fos = new FileOutputStream("dev.txt"); ObjectOutputStream os = new ObjectOutputStream(fos); os.writeObject(m); os.close(); FileInputStream fis = new FileInputStream("dev.txt"); ObjectInputStream is = new ObjectInputStream(fis); MiniPlayer m2 = (MiniPlayer) is.readObject(); is.close(); System.out.println(); } catch (Exception x) { System.out.print("x "); } } } 
+6
source share
5 answers

No. During the serialization process, only fields of Serializable objects are written out and restored.

According to javadocs

During deserialization, the fields of classes that are not related to serialization will be initialized using the public or protected constructor of the no-arg class.

Where, when the fields of serializable subclasses will be restored from the stream.

Please see this example.
Here ElectronicDevice not Serializable , where as Mp3player is Serializable . Take the behavior fields of respected classes during the serialization process.

 import java.io.*; class ElectronicDevice { public int i = 0; protected ElectronicDevice() { System.out.println("ed "); } } class Mp3player extends ElectronicDevice implements Serializable { int j =0; Mp3player() { System.out.println("mp "); } } class MiniPlayer extends Mp3player { MiniPlayer() { System.out.println("mini "); } public static void main(String[] args) { MiniPlayer m = new MiniPlayer(); mi = 30; mj = 40; try { System.out.println("i value before serialization: "+mi);//prints 30 System.out.println("i value before serialization: "+mj);//prints 40 FileOutputStream fos = new FileOutputStream("dev.txt"); ObjectOutputStream os = new ObjectOutputStream(fos); os.writeObject(m); os.close(); FileInputStream fis = new FileInputStream("dev.txt"); ObjectInputStream is = new ObjectInputStream(fis); MiniPlayer m2 = (MiniPlayer) is.readObject(); is.close(); System.out.println("i value after serialization: "+m2.i);//prints o System.out.println("j value after serialization: "+m2.j);//prints 40 System.out.println(); } catch (Exception x) { x.printStackTrace(); System.out.print("x "); } } } 
+3
source

Since the superclass does not implement the serializable contents of the superclass, it will not be serialized. Only the contents of the subclass would receive serialization. When you do the deserialization, the default constructor of the superclass will be executed, and the fields of the superclass will be initialized as if you were calling the default constructor.

The following example illustrates this.

 public class SerializationTest { public static class Base { private String name; public Base() { this.name = "johnDow"; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static class Sub extends Base implements Serializable { private static final long serialVersionUID = 1L; private String age; public String getAge() { return age; } public void setAge(String age) { this.age = age; } } public static void main(String[] args) throws Exception { ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArrayOS); Sub s = new Sub(); s.setName("name"); s.setAge("10"); out.writeObject(s); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(byteArrayOS.toByteArray())); Sub d = (Sub) ois.readObject(); System.out.println(d.getName() + "-" + d.getAge()); } } 

What is printed

 johnDow-10 
+4
source

This is the rule for serializing a superclass:

If you are a serializable class, but your superclass is NOT serializable, then any instance variables that you INHERIT from this superclass will be reset to the values ​​that they were specified during the original construction of the object. This is because the constructor of non-serializable classes will be executed.

Therefore, if you add some instance variables to ElectronicDevice, keep in mind that the state of the superclass will not be serialized. (if the superclass does not execute Serializable)

+1
source

My understanding of the super class is also being serialized due to extends.let me know that my understanding is correct or not.

The short answer is NO .

In java, each class is a subclass of Object . Does Object itself implement Serializable ?

0
source

To allow serialization of subtypes of non-serializable classes, the subtype may take responsibility for maintaining and restoring the state of the supertype, open, protected and (if available) fields of the package "

Link - http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

0
source

Source: https://habr.com/ru/post/952419/


All Articles