Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How serialization works when only subclass implements serializable

Only subclass has implemented Serializable interface.

import java.io.*;  public class NewClass1{      private int i;     NewClass1(){     i=10;     }     int getVal() {         return i;     }     void setVal(int i) {         this.i=i;     } }  class MyClass extends NewClass1 implements Serializable{      private String s;     private NewClass1 n;      MyClass(String s) {         this.s = s;         setVal(20);     }      public String toString() {         return s + " " + getVal();     }      public static void main(String args[]) {         MyClass m = new MyClass("Serial");         try {             ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serial.txt"));             oos.writeObject(m); //writing current state             oos.flush();             oos.close();             System.out.print(m); // display current state object value         } catch (IOException e) {             System.out.print(e);         }         try {             ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serial.txt"));             MyClass o = (MyClass) ois.readObject(); // reading saved object             ois.close();             System.out.print(o); // display saved object state         } catch (Exception e) {             System.out.print(e);         }     } } 

One thing, which I noticed here is, parent class is not serialized. Then, why didn't it throw NotSerializableException indeed it is showing following

Output

Serial 20 Serial 10 

Also, output differ from Serialization and De-serialization. I just only know, it is because of parent class has not implemented Serializable. But, If anyone explain me, what happens during object serialization and de-serialization. How it changes the value ? I'm not able to figure out, also I have used comment in my program. So, if I'm wrong at any point, please let me know.

like image 553
Ravi Avatar asked Dec 26 '12 15:12

Ravi


People also ask

Can a subclass implement serializable?

Hence, even though subclass doesn't implement Serializable interface( and if its superclass implements Serializable), then we can serialize subclass object.

Can we serialize class without implementing serializable interface?

No. If you want to serialise an object it must implement the tagging Serializable interface.

What happens if your serializable class contains a member which is not serializable?

It'll throw a NotSerializableException when you try to Serialize it. To avoid that, make that field a transient field.

How can subclass avoid serialization?

In order to prevent subclass from serialization we need to implement writeObject() and readObject() methods which are executed by JVM during serialization and deserialization also NotSerializableException is made to be thrown from these methods.


1 Answers

according to the Serializable javadoc

During deserialization, the fields of non-serializable classes will be initialized using the public or protected no-arg constructor of the class. A no-arg constructor must be accessible to the subclass that is serializable. The fields of serializable subclasses will be restored from the stream.

also, serialization exception is only thrown if the class being serialized is not serializable. having non-serializable parents is fine (as long as they have a no-arg constructor). Object itself isnt Serializable, and everything extends it. the quote above also explains why you get different values for the value field - the no-arg constructor for the parent class is set, which sets the value field to 10 - the field belongs to the (non-serializable) parent so its value isnt written to/read from the stream.

like image 182
radai Avatar answered Sep 25 '22 06:09

radai