Externalizable interface in Java

The Externalizable interface provides a means for defining custom rules and implementing a personalized mechanism for object serialization. Prior to investigating into the intricacies of the Externalizable interface, it is essential to grasp the concept of serialization. Java Serialization offers built-in functionality to store objects and subsequently restore them. It employs intricate algorithms to comprehensively define the objects to be stored.

Serialization

In the serialization process, the responsibility for writing and reading objects lies entirely with the Java Virtual Machine (JVM). This default behavior proves advantageous in most scenarios, as it absolves developers from the need to concern themselves with the underlying complexities of serialization. By default, all instance variables, excluding static and transient variables, undergo the serialization process. Nonetheless, default serialization fails to safeguard sensitive information like passwords and credentials. Moreover, it falls short when developers aim to secure specific information during serialization.

Purpose

The purpose of the Externalizable interface extends beyond optimizing the performance of the serialization process. It serves as a means to implement custom processing and grants complete control over the format and contents of the object stream, including its super types. Externalization empowers programmers with full control over reading and writing objects during serialization, allowing for personalized and tailored handling of object streams.

Marshalling and unmarshalling objects

As its name suggests, the Externalizable interface facilitates the process of externalizing serialization. It enables the utilization of a custom-written mechanism for marshalling and unmarshalling objects. It is worth noting that the Externalizable interface extends the Serializable interface. When implementing this interface, it is necessary to override the following methods:

writeExternal(ObjectOutput out)

An object must implement this method, in order to store its state. For primitive types, the methods of the ObjectOutput class are called, while for objects, string and arrays, the writeObject method is sufficient.

readExternal(ObjectInput in)

An object implements this method, in order to restore its state. The readExternal method must read all values, along with their types, in the same sequence and format, as they were written by the writeExternal method.

Example
import java.io.*; public class TestClass implements Externalizable { public void writeExternal(ObjectOutput out) { // implement your own code to write objects of this class } public void readExternal(ObjectInput in) { // implement your own code to read serialized objects of this class } }

In earlier versions of Java, the reflection mechanism was known for its sluggish performance, which posed challenges when serializing large object graphs. To address this concern, the java.io.Externalizable interface was introduced as an alternative to java.io.Serializable. The Externalizable interface allows for the implementation of custom-written mechanisms for marshalling and unmarshalling objects.

Conclusion

With advancements in recent versions of Java, the performance of reflection has significantly improved, thereby mitigating the aforementioned performance issue. Consequently, the need for Externalization has become less prevalent. It is now primarily employed in rare cases where there is a specific requirement to store and reconstruct objects using an entirely different approach that does not rely on the default serialization mechanisms for data fields.