Saturday, April 16, 2011

What is Serialization in Java
Java Serialization is one of important concept but it’s been rarely used as persistence solution and developer mostly overlooked Java serialization API. As per my experience Java Serialization is quite an important topic in any core Java interview, In almost all the interview I have faced there is one or two Java serialization questions and I have seen interview where after few question on serialization candidate start feeling uncomfortable because of lack of experience in this area. They don’t know How to serialize object in Java or they are not familiar with any Java Serialization example to explain, forget about questions like Difference between transient and volatile variable or Difference between Externalizable and Serializable in Java. In this article we will question from both beginner and advanced level, which can be equally beneficial to freshers, new comers and senior Java developers with some years of Java development experience.

10 Interview questions on Serialization in Java

Most commercial project uses either database or memory mapped file or simply flat file for there persistence requirement and only few of them rely on serialization process in Java. Anyway this post is not a Java serialization tutorial or how to serialize object in java but about interview questions around serialization mechanism and Serialization API, Which is worth to have a look before going for any Java or J2EE interview and surprising yourself with some unknown contents. for those who are not familiar about java Serialization "Java serialization is the process which is used to serialize object in java by storing object’s state into a file with extension .ser and recreating object's state from that file, this reverse process is called deserialization.

What is Serialization in Java

Object Serialization in Java is a process used to convert Object into a binary format which can be persisted into disk or sent over network to any other running Java virtual machine; the reverse process of creating object from binary stream is called deserialization in Java. Java provides Serialization API for serializing and deserializing object which includes java.io.Serializable, java.io.Externalizable, ObjectInputStream and ObjectOutputStream etc. Java programmers are free to use default Serialization mechanism which Java uses based upon structure of class but they are also free to use there own custom binary format, which is often advised as Serialization best practice, Because serialized binary format becomes part of Class's exported API and it can potentially break Encapsulation in Java provided by private and package-private fields. This pretty much answer the question What is Serialization in Java.

How to make a Java class Serializable?

Making a class Serializable in Java is very easy, Your Java class just needs to implements java.io.Serializable interface and JVM will take care of serializing object in default format. Decision to making a Class Serializable should be taken concisely because though near term cost of making a Class Serializable is low, long term cost is substantial and it can potentially limit your ability to further modify and change its implementation because like any public API, serialized form of an object becomes part of public API and when you change structure of your class by implementing addition interface, adding or removing any field can potentially break default serialization, this can be minimized by using a custom binary format but still requires lot of effort to ensure backward compatibility. One example of How Serialization can put constraints on your ability to change class is SerialVersionUID. If you don't explicitly declare SerialVersionUID then JVM generates its based upon structure of class which depends upon interfaces a class implements and several other factors which is subject to change. Suppose you implement another interface than JVM will generate a different SerialVersionUID for new version of class files and when you try to load old object object serialized by old version of your program you will get InvalidClassException.

Question 1) What is the difference between Serializable and Externalizable interface in Java?

This is most frequently asked question in Java serialization interview. Here is my version Externalizable provides us writeExternal() and readExternal() method which gives us flexibility to control java serialization mechanism instead of relying on Java's default serialization. Correct implementation of Externalizable interface can improve performance of application drastically.

Question 2) How many methods Serializable has? If no method then what is the purpose of Serializable interface?

Serializable interface exists in java.io package and forms core of java serialization mechanism. It doesn't have any method and also called Marker Interface in Java. When your class implements java.io.Serializable interface it becomes Serializable in Java and gives compiler an indication that use Java Serialization mechanism to serialize this object.

Question 3) What is serialVersionUID? What would happen if you don't define this?

One of my favorite question interview question on Java serialization. SerialVersionUID is an ID which is stamped on object when it get serialized usually hashcode of object, you can use tool serialver to see serialVersionUID of a serialized object . SerialVersionUID is used for version control of object. you can specify serialVersionUID in your class file also. Consequence of not specifying serialVersionUID is that when you add or modify any field in class then already serialized class will not be able to recover because serialVersionUID generated for new class and for old serialized object will be different. Java serialization process relies on correct serialVersionUID for recovering state of serialized object and throws java.io.InvalidClassException in case of serialVersionUID mismatch, to learn more about serialversionuid see this article.

Question 4) While serializing you want some of the members not to serialize? How do you achieve it?

Another frequently asked Serialization interview question. This is sometime also asked as what is the use of transient variable, does transient and static variable gets serialized or not etc. so if you don't want any field to be part of object's state then declare it either static or transient based on your need and it will not be included during Java serialization process.

Question 5) What will happen if one of the members in the class doesn't implement Serializable interface?

One of the easy question about Serialization process in Java. If you try to serialize an object of a class which implements Serializable, but the object includes a reference to an non- Serializable class then a ‘NotSerializableException’ will be thrown at runtime and this is why I always put a SerializableAlert (comment section in my code) , one of the code comment best practices, to instruct developer to remember this fact while adding a new field in a Serializable class.

Question 6) If a class is Serializable but its super class in not, what will be the state of the instance variables inherited from super class after deserialization?

Java serialization process only continues in object hierarchy till the class is Serializable i.e. implements Serializable interface in Java and values of the instance variables inherited from super class will be initialized by calling constructor of Non-Serializable Super class during deserialization process. Once the constructor chaining will started it wouldn't be possible to stop that , hence even if classes higher in hierarchy implements Serializable interface , there constructor will be executed. As you see from the statement this Serialization interview question looks very tricky and tough but if you are familiar with key concepts its not that difficult.

Question 7) Can you Customize Serialization process or can you override default Serialization process in Java?

The answer is yes you can. We all know that for serializing an object ObjectOutputStream.writeObject (saveThisobject) is invoked and for reading object ObjectInputStream.readObject() is invoked but there is one more thing which Java Virtual Machine provides you is to define these two method in your class. If you define these two methods in your class then JVM will invoke these two methods instead of applying default serialization mechanism. You can customize behavior of object serialization and deserialization here by doing any kind of pre or post processing task. Important point to note is making these methods private to avoid being inherited, overridden or overloaded. Since only Java Virtual Machine can call private method integrity of your class will remain and Java Serialization will work as normal. In my opinion this is one of the best question one can ask in any Java Serialization interview, a good follow-up question is why should you provide custom serialized form for your object?

Question 8) Suppose super class of a new class implement Serializable interface, how can you avoid new class to being serialized?

One of the tricky interview question in Serialization in Java. If Super Class of a Class already implements Serializable interface in Java then its already Serializable in Java, since you can not unimplemented an interface its not really possible to make it Non Serializable class but yes there is a way to avoid serialization of new class. To avoid Java serialization you need to implement writeObject() and readObject() method in your Class and need to throw NotSerializableException from those method. This is another benefit of customizing java serialization process as described in above Serialization interview question and normally it asked as follow-up question as interview progresses.

Question 9) Which methods are used during Serialization and DeSerialization process in Java?

This is very common interview question in Serialization basically interviewer is trying to know; Whether you are familiar with usage of readObject(), writeObject(), readExternal() and writeExternal() or not. Java Serialization is done by java.io.ObjectOutputStream class. That class is a filter stream which is wrapped around a lower-level byte stream to handle the serialization mechanism. To store any object via serialization mechanism we call ObjectOutputStream.writeObject(saveThisobject) and to deserialize that object we call ObjectInputStream.readObject() method. Call to writeObject() method trigger serialization process in java. one important thing to note about readObject() method is that it is used to read bytes from the persistence and to create object from those bytes and its return an Object which needs to be type cast to correct type.

Question 10) Suppose you have a class which you serialized it and stored in persistence and later modified that class to add a new field. What will happen if you deserialize the object already serialized?

It depends on whether class has its own serialVersionUID or not. As we know from above question that if we don't provide serialVersionUID in our code java compiler will generate it and normally it’s equal to hashCode of object. by adding any new field there is chance that new serialVersionUID generated for that class version is not the same of already serialized object and in this case Java Serialization API will throw java.io.InvalidClassException and this is the reason its recommended to have your own serialVersionUID in code and make sure to keep it same always for a single class.

11) What are the compatible changes and incompatible changes in Java Serialization Mechanism?

The real challenge lies with change in class structure by adding any field, method or removing any field or method is that with already serialized object. As per Java Serialization specification adding any field or method comes under compatible change and changing class hierarchy or UN-implementing Serializable interfaces some under non compatible changes. For complete list of compatible and non compatible changes I would advise reading Java serialization specification.

12) Can we transfer a Serialized object vie network?

Yes you can transfer a Serialized object via network because Java serialized object remains in form of bytes which can be transmitter via network. You can also store serialized object in Disk or database as Blob.

13) Which kind of variables is not serialized during Java Serialization?

This question asked sometime differently but the purpose is same whether Java developer knows specifics about static and transient variable or not. Since static variables belong to the class and not to an object they are not the part of the state of object so they are not saved during Java Serialization process. As Java Serialization only persist state of object and not object itself. Transient variables are also not included in java serialization process and are not the part of the object’s serialized state. After this question sometime interviewer ask a follow-up if you don't store values of these variables then what would be value of these variable once you deserialize and recreate those object? This is for you guys to think about .

44 comments
:

Anonymous
said...

Dude I am not completely agree with your statement "Serialization is one of important concept but it’s been rarely used as persistence solution" I also work for Investment bank and we use Serialization to persist our equity trading application . We used to persist our Orders and Executions in serialized format and recover from them when our trading application restarts.

Comprehensive list! One aspect of serialization not covered here is the use of readResolve/writeReplace.

Judicious use of these methods goes a long way accomodating: i) changes to class signature where a serialversionUUID is declared and readObject/writeObject are not defined or updated ii) you want class instances to masquerade as something totally different. e.g. a LineItem is serialized as a Hashtable (aka key/value pairs)

@JustGettingBy , Thanks for your valuable comments and adding value into this blog post. yes readResolve()is quite important because its gives kind of flexibility you need to keep your Singleton as Singleton during serialization and desrialization etc.

If class A,B,C,D are such that B extends A, C extends B and so on and if class A and D implents serializable. Then will constructor of class A,B,C will be executed? This question comes to my mind after reading answers to Q6 and Q8. Can you please clarify ?

The answer to question asked by writer of this page to us:Question:13th question's part:After this question sometime interviewer ask a follow-up if you don't store values of these variables then what would be value of these variable once you deserialize and recreate those object?Answer: We get the default value of the object as I tested. Example: In case of static String or transient String, you will get NULL value of variable after deserializaton :)

Great collection of serialization interview questions. you have almost covered everything in serialization in Java, its not just good for interview but also from learning Java serialization or do I say a good Java Serialization tutorial, keep working.

Hi Deepak, Serializable is an interface and work class by class, you can not make whole package serializable or non serializable. If you are extending from a class which is serializable and you want to make your sub class non serializable just add writeObject() and readObject() and throw NonSerializableException, let me know if you face any issue doing it or if you are facing altogether different issue.

Isn't What is Serialization in Java should be first question ?What is Serialization in Java?Serialization in Java is a process to store Object's state into binary format to store on persistent storage like File system or sending over network. Serialization is handled by JVM itself by marker interface Serializable which says that object of this class can be Serialized. Java also provides several construct to control Serialization like Externalizable interface, transient variables etc.

Nice article, it cleared all my doubts regaring Serialization. However, I have a concern.

This is regarding question no 6.You mentioned that "if classes higher in hierarchy implements Serializable interface , there constructor will be executed."

If the parent class implements Serializable, then all the child class will automatically be Serializable, and hence, in that case the constructor will never be called, as the entire class hierarchy is Serializable now.

Nice article, explanation is good.I was having one question in my mind as this serialization is the mechanism that JVM takes care of serializing the object. So there must be some code written where it is trying to serialize the object (correct me if I am wrong), Where can we find that code which is doing this serialization ?

I am regular reader of your blog & find it far ahead of other blogs in terms of approach for explanation of java concepts.I have one confusion. Serialization can be obtained by implementing serializable interface & this interface dont have any method. So java do all serialization thing. Explain me how? Will java call any other class/method & how this interface is different from user defined interfaces.

@Shariq Bharat, Thanks for kind word. By the way you have raised a good question, How does Serialization works, if there is no method in Serializable interface. Well, As you might know Serializable is a marker interface, they are instruction for compiler or runtime. By implementing Serialiazable interface, Developer ask Java to take care of saving state of that object. JVM which is responsible for actual work i.e. reading object's state and converting into Serialized format, uses default serialization process, if not modified using Externalizable interface. Actual Saving of object is done by using ObjectOutputStream. I will try to explain this in more detail, may be in a blog post.

7) Can you Customize Serialization process or can you override default Serialization process in Java?

For this question you answered that,we can declare our own readObject,writeObject methods to do our serialization.In that case 'readObject' and 'writeObject' methods are from 'ObjectInputStream' and 'ObjectOutputStream' classes and these methods are final methods.Then how can we override ?

I was going thru the que 6 and found "Once the constructor chaining will started it wouldn't be possible to stop that , hence even if classes higher in hierarchy implements Serializable interface , there constructor will be executed". So the question, how does this possible? If a super class is serializable then sub class will be automatically. :)

Its a very good article thank you very much..........the last question you asked i tried.................------>>>>what would be value of these variable once you deserialize and recreate those object?It give null output for the transient variables.......so is it true or not ?Please ensure me...........

Hi,When you declared variable as transient that variable will not serialize but how i can check whether particular variable is serialize or not.so that i can assure that variable not serialized when used with transient

This is regarding question 8. I tried this at HOME :) and serialization seems a special case. I had class B extend class A which was serializable while B wasnt. when I tried to serialize B I got the exception that B is not serializable, basically we dont need to implement any method specifically and throw NotSerializableException for scenario 8.public class ParentA implements Serializable{

public class IntermediateB extends ParentA {

object.writeObject(fileoutB);

Seems like serialization is a special case for inheritanceException in thread "main" java.io.NotSerializableException: java.io.FileOutputStream

Many People have asked that readObject() & writeObject() are final methods from ObjectInputStream & ObjectOutputStream so how can we Override it?The answer to that is, you are confused about Method Overriding.First of all Our Class is never Extending neither ObjectInputStream, nor ObjectOutputStream, so it can't be called Overriding.Check back with your Overriding Concepts.

Secondly when we do define these methods a.k.a. readObject() & writeObject(), acc. to me, we are directing JVM to use our Defined methods for Serializing/De-serializing the Object of this Class, rather than using the ObjectInputStream & ObjectOutputStream Class methods & thats how we achieve Customization in Serialization.

BTW this post is really informative & very good coverage of Serialization TopicIf there would have been some questions bout readResolve() writeReplace(), it would have been the Best

You are correct, You don't need to override readObject() from ObjectInputStream and writeObject() from ObjectOutputStream for serializing objects, but yes its confusing.

Whole Serialization concept is little bit secret because JVM does most of the things without telling you directly. You mark your class as Serializable which is a signal to JVM that it can Serialize that object using default Serialization mechanism.

Regarding readResolve() and writeReplace(), sure will add few questions as they are really important especially while keeping a Singleton class singleton during de-serialization.