Welcome!

Weblogic Authors: Yeshim Deniz, Elizabeth White, Michael Meiner, Michael Bushong, Avi Rosenthal

Related Topics: Java IoT

Java IoT: Article

Java Serialization - Lesson 7

Java Serialization - Lesson 7

In lessons 5 and 6 of this series you've learned how to use some of the Java streams to read or write bytes, characters or numeric data. This lesson is about reading or writing entire Java objects into streams.

Let's say your application uses a class that looks like this:

class Employee {
String lName;
String fName;
double salary;
java.util.Date hireDate;
String address;
}

Now consider the following scenario: a program HeadQuarterEmpProcessor creates an instance of the object Employee. The values of its attributes (object's state) have to be saved in a file or some other stream. Later on, another program called BranchEmpProcessor needs to recreate the instance of this object Employee in memory.

We could have done it by using one of the streams like DataOutputStream, FileWriter or others. In this case both programs would need to know a format of the saved file (data types, order of the attributes and delimiters). Luckily, Java offers a more elegant way called object serialization, which greatly simplifies the process of objects exchange.

To send the entire object to a stream a program can use the class java.io.ObjectOutputStream, while the class java.io.ObjectInputStream knows how to get an object from a stream. To serialize an object means to convert it into a set of bytes and send it to a stream. To deserialize and object means to read these bytes from a stream and recreate the instance of the received object.

How to Make a Class Serializable

To make a class serializable, just declare that this class implements the interface Serializable:

class Employee implements java.io.Serializable {
String lName;
String fName;
double salary;
java.util.Date hireDate;
String address;
}

The good news is that Serializable interface does not force you to implement any methods, that's why modification of the class Employee was minimal.

All attributes of the class Employee must have either primitive data types, or represent objects that are also serializable.

How to Serialize an Object

To serialize an object into a stream perform the following actions:

  • Open one of the output streams, for example FileOutputStream
  • Chain it with the ObjectOutputStream
  • Call the method writeObject() providing the instance of a Serializable object as an argument.
  • Close the streams

The following example performs all these steps and creates a snapshot of the object Employee in the file called NewEmployee.ser

import java.io.*;
import java.util.Date;

public class HeadQuarterEmpProcessor {

public static void main(String[] args) {
Employee emp = new Employee();
emp.lName = "John";
emp.fName = "Smith";
emp.salary = 50000;
emp.address = "12 main street";
emp.hireDate = new Date();

FileOutputStream fOut=null;
ObjectOutputStream oOut=null;

try{
fOut= new FileOutputStream("c:\\NewEmployee.ser");
oOut = new ObjectOutputStream(fOut);
oOut.writeObject(emp); //serializing employee
System.out.println(
"An employee is serialized into c:\\NewEmployee.ser");
}catch(IOException e){
e.printStackTrace();
}finally{
try {
oOut.flush();
oOut.close();
fOut.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}

If you do not want to serialize sensitive information such as salary, declare this variable using the keyword transient:

transient double salary;

The values of static and transient member variables are not serialized.

How to Deserialize an Object

To deserialize an object perform the following steps:

  • Open an input stream
  • Chain it with the ObjectInputStream
  • Call the method readObject() and cast the returned object to the class that is being deserialized.
  • Close the streams

The next example reads our file NewEmployee.ser and recreates the instance of the object Employee:

import java.io.*;

public class BranchEmpProcessor {

public static void main(String[] args) {
FileInputStream fIn=null;
ObjectInputStream oIn=null;

try{
fIn= new FileInputStream("c:\\NewEmployee.ser");
oIn = new ObjectInputStream(fIn);

//de-serializing employee
Employee emp = (Employee) oIn.readObject();

System.out.println("Deserialized " + emp.fName + " "
+ emp.lName + " from NewEmployee.ser ");
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}finally{
try {
oIn.close();
fIn.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}

The class BranchEmpProcessor will produce the following output:

Deserialized Smith John from NewEmployee.ser

Please note that we did not explicitly created an instance of the object Employee – JVM did it for us. Make sure that definition of the class Employee is available to JVM that reads the stream. In distributed applications it usually runs on a remote machine.

During the process of deserialization all transient variables will be initialized with default values according to their type, for example integer variables will have the value of zero.

Interface Externalizable

The method writeObject() sends all attributes of an object into a stream. This could lead to unnecessary large object footprint, especially if you need to serialize the values only of some of the instance variables. Java provides Externalizable interface that gives you more control over what is being serialized and it can produce smaller object footprint. Externalizable interface is a subclass of Serializable.

This interface defines 2 methods: readExternal() and writeExternal() and you have to implement these methods in the class that will be serialized (Employee). In these methods you'll have to write code that reads/writes only the values of the attributes you are interested in. Programs that perform serialization and deserialization have to write and read these attributes in the same sequence.

The following class Employee2 serializes only the values of the last name and salary.

import java.io.ObjectOutput;
import java.io.ObjectInput;
class Employee2 implements Externalizable {
String lName;
String fName;
double salary;
java.util.Date hireDate;
String address;

public void writeExternal(ObjectOutput stream)
throws java.io.IOException {
// Serializing only salary and last name
stream.writeDouble(salary);
stream.writeUTF(lName); // String encoded in UTF-8 format
}

public void readExternal(ObjectInput stream)
throws java.io.IOException {
salary = stream.readDouble();
lName = stream.readUTF();
}

}

The class HeadQuaterEmpProcessor2 shows how to externalize the object Employee2:

import java.io.*;
import java.util.Date;

public class HeadQuarterEmpProcessor2 {

public static void main(String[] args) {
Employee2 emp = new Employee2();
emp.fName = "John";
emp.lName = "Smith";
emp.salary = 50000;
emp.address = "12 main street";
emp.hireDate = new Date();

FileOutputStream fOut=null;
ObjectOutputStream oOut=null;

try{
fOut= new FileOutputStream("c:\\NewEmployee2.ser");
oOut = new ObjectOutputStream(fOut);
emp.writeExternal(oOut); //serializing employee
System.out.println(
"An employee is serialized into c:\\NewEmployee2.ser");

}catch(IOException e){
e.printStackTrace();
}finally{
try {
oOut.flush();
oOut.close();
fOut.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}

Unlike with Serializable interface, we had to write a little more code to implement Externalizable interface, but the size of the file NewEmployee2.ser is only 21 bytes, whereas the file NewEmployee.ser has 207 bytes. First of all, we serialized the values of only two attributes, and the other reason is that files created using Externalizable interface contain data only, while files created by default Java serialization contain class metadata that include attribute names.

The next code snippet shows you how to recreate an externalized object:

fIn= new FileInputStream("c:\\NewEmployee2.ser");
oIn = new ObjectInputStream(fIn);

Employee2 emp = new Employee2();
emp.readExternal(oIn);

Serializaion in the Real World

In some types of applications you have to write the code to serialize objects, but in many cases serialization is performed behind the scenes by various server-side containers. These are some of the typical uses of serialization:

  • To persist data for future use.
  • To send data to a remote computer using such client/server Java technologies as RMI or socket programming.
  • To "flatten" an object into array of bytes in memory.
  • To exchange data between applets and servlets.
  • To store user session in Web applications.
  • To activate/passivate enterprise java beans.
  • To send objects between the servers in a cluster.

When you use serialization in time-critical applications, for example real- time stock trading systems, the size of the serialized objects should be minimal. Keep in mind that variables with longer names produce larger footprints during serialization, and this may substantially slow down your application. Think of a high volume of trade orders that is being serialized. I remember working on the application where a class TradeOrder had about a hundred member variables. After renaming the variables into meaningless v1, v2, and so on, the size of one TradeOrder instance was reduced by a thousand bytes. And we are talking about serializing of thousands orders over the network!

If performance is your primary goal, use Externalizable interface instead of Serializable. Yes, you'll have to write code to serialize each attribute, but this may speed up serialization process substantially.

While applets can connect to a remote computer using socket or RMI programming (these technologies will be explained in the future lessons of this series), HTTP protocol and such Java classes as URL and URLConnection simplify network programming. With an HTTP protocol, applets can receive or send not only a text, but also binary objects using Java Serialization.

When an EJB container decides to passivate (unload from memory) so-called stateful session bean, JVM persists its state in a safe place (usually on a disk). Later on, when this bean will be activated again, all its variables will be automatically deserialized by the EJB container.

It's not too difficult for JVM to convert a primitive integer variable into four bytes for serialization, but it's not as simple in case of classes containing variables with references to other objects. The process of converting such complex object into a sequence of bytes is called marshalling and the process of reconstructing of the objects from these bytes is called unmarshalling and Java does this job for you.

Even though we have not learned yet how to create Web applications, I still want to mention that objects used for tracking of the user sessions should be serializable, otherwise you may not be able to deploy these application in a cluster of servers.

Java serialization is a simple but powerful feature of the language, and you'll definitely will have a chance to use it in your applications.

More Stories By Yakov Fain

Yakov Fain is a Java Champion and a co-founder of the IT consultancy Farata Systems and the product company SuranceBay. He wrote a thousand blogs (http://yakovfain.com) and several books about software development. Yakov authored and co-authored such books as "Angular 2 Development with TypeScript", "Java 24-Hour Trainer", and "Enterprise Web Development". His Twitter tag is @yfain

Comments (3) View Comments

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


Most Recent Comments
veddhunk 06/03/10 01:27:00 AM EDT

Wow!! This article was really good. Can some let me know where can i find other topics related to java, servlets and jsp.
This was chapter7 from java, where can i find other chapters?.
Thanks!

Alexandre Barão 03/25/04 06:37:46 AM EST

As a teacher i have to say that this lesson is a powerfull
resource for my students in Lisbon. Thanks!

Alessandro 02/27/04 07:22:48 AM EST

Very interesting article. I guess one of the most flexible way to serialize objects is the beam XML serialization,(XMLEncoder & XMLDecoder), becouse it do not lost compatibility when the class is updated. The cons is there is not XML encoding\decoding in Java 1.1, i.e, applets, unless we build a our own java 1.1 XML encode/decode class routines.

@ThingsExpo Stories
Organizations planning enterprise data center consolidation and modernization projects are faced with a challenging, costly reality. Requirements to deploy modern, cloud-native applications simultaneously with traditional client/server applications are almost impossible to achieve with hardware-centric enterprise infrastructure. Compute and network infrastructure are fast moving down a software-defined path, but storage has been a laggard. Until now.
Digital Transformation is much more than a buzzword. The radical shift to digital mechanisms for almost every process is evident across all industries and verticals. This is often especially true in financial services, where the legacy environment is many times unable to keep up with the rapidly shifting demands of the consumer. The constant pressure to provide complete, omnichannel delivery of customer-facing solutions to meet both regulatory and customer demands is putting enormous pressure on...
The best way to leverage your CloudEXPO | DXWorldEXPO presence as a sponsor and exhibitor is to plan your news announcements around our events. The press covering CloudEXPO | DXWorldEXPO will have access to these releases and will amplify your news announcements. More than two dozen Cloud companies either set deals at our shows or have announced their mergers and acquisitions at CloudEXPO. Product announcements during our show provide your company with the most reach through our targeted audienc...
DXWorldEXPO LLC announced today that All in Mobile, a mobile app development company from Poland, will exhibit at the 22nd International CloudEXPO | DXWorldEXPO. All In Mobile is a mobile app development company from Poland. Since 2014, they maintain passion for developing mobile applications for enterprises and startups worldwide.
"Akvelon is a software development company and we also provide consultancy services to folks who are looking to scale or accelerate their engineering roadmaps," explained Jeremiah Mothersell, Marketing Manager at Akvelon, in this SYS-CON.tv interview at 21st Cloud Expo, held Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA.
JETRO showcased Japan Digital Transformation Pavilion at SYS-CON's 21st International Cloud Expo® at the Santa Clara Convention Center in Santa Clara, CA. The Japan External Trade Organization (JETRO) is a non-profit organization that provides business support services to companies expanding to Japan. With the support of JETRO's dedicated staff, clients can incorporate their business; receive visa, immigration, and HR support; find dedicated office space; identify local government subsidies; get...
"We view the cloud not as a specific technology but as a way of doing business and that way of doing business is transforming the way software, infrastructure and services are being delivered to business," explained Matthew Rosen, CEO and Director at Fusion, in this SYS-CON.tv interview at 18th Cloud Expo (http://www.CloudComputingExpo.com), held June 7-9 at the Javits Center in New York City, NY.
DXWorldEXPO LLC announced today that the upcoming DXWorldEXPO | CloudEXPO New York event will feature 10 companies from Poland to participate at the "Poland Digital Transformation Pavilion" on November 12-13, 2018.
The current age of digital transformation means that IT organizations must adapt their toolset to cover all digital experiences, beyond just the end users’. Today’s businesses can no longer focus solely on the digital interactions they manage with employees or customers; they must now contend with non-traditional factors. Whether it's the power of brand to make or break a company, the need to monitor across all locations 24/7, or the ability to proactively resolve issues, companies must adapt to...
As data explodes in quantity, importance and from new sources, the need for managing and protecting data residing across physical, virtual, and cloud environments grow with it. Managing data includes protecting it, indexing and classifying it for true, long-term management, compliance and E-Discovery. Commvault can ensure this with a single pane of glass solution – whether in a private cloud, a Service Provider delivered public cloud or a hybrid cloud environment – across the heterogeneous enter...
DXWorldEXPO LLC announced today that ICC-USA, a computer systems integrator and server manufacturing company focused on developing products and product appliances, will exhibit at the 22nd International CloudEXPO | DXWorldEXPO. DXWordEXPO New York 2018, colocated with CloudEXPO New York 2018 will be held November 11-13, 2018, in New York City. ICC is a computer systems integrator and server manufacturing company focused on developing products and product appliances to meet a wide range of ...
More and more brands have jumped on the IoT bandwagon. We have an excess of wearables – activity trackers, smartwatches, smart glasses and sneakers, and more that track seemingly endless datapoints. However, most consumers have no idea what “IoT” means. Creating more wearables that track data shouldn't be the aim of brands; delivering meaningful, tangible relevance to their users should be. We're in a period in which the IoT pendulum is still swinging. Initially, it swung toward "smart for smart...
Major trends and emerging technologies – from virtual reality and IoT, to Big Data and algorithms – are helping organizations innovate in the digital era. However, to create real business value, IT must think beyond the ‘what’ of digital transformation to the ‘how’ to harness emerging trends, innovation and disruption. Architecture is the key that underpins and ties all these efforts together. In the digital age, it’s important to invest in architecture, extend the enterprise footprint to the cl...
Headquartered in Plainsboro, NJ, Synametrics Technologies has provided IT professionals and computer systems developers since 1997. Based on the success of their initial product offerings (WinSQL and DeltaCopy), the company continues to create and hone innovative products that help its customers get more from their computer applications, databases and infrastructure. To date, over one million users around the world have chosen Synametrics solutions to help power their accelerated business or per...
Coca-Cola’s Google powered digital signage system lays the groundwork for a more valuable connection between Coke and its customers. Digital signs pair software with high-resolution displays so that a message can be changed instantly based on what the operator wants to communicate or sell. In their Day 3 Keynote at 21st Cloud Expo, Greg Chambers, Global Group Director, Digital Innovation, Coca-Cola, and Vidya Nagarajan, a Senior Product Manager at Google, discussed how from store operations and ...
We are seeing a major migration of enterprises applications to the cloud. As cloud and business use of real time applications accelerate, legacy networks are no longer able to architecturally support cloud adoption and deliver the performance and security required by highly distributed enterprises. These outdated solutions have become more costly and complicated to implement, install, manage, and maintain.SD-WAN offers unlimited capabilities for accessing the benefits of the cloud and Internet. ...
In an era of historic innovation fueled by unprecedented access to data and technology, the low cost and risk of entering new markets has leveled the playing field for business. Today, any ambitious innovator can easily introduce a new application or product that can reinvent business models and transform the client experience. In their Day 2 Keynote at 19th Cloud Expo, Mercer Rowe, IBM Vice President of Strategic Alliances, and Raejeanne Skillern, Intel Vice President of Data Center Group and ...
Dion Hinchcliffe is an internationally recognized digital expert, bestselling book author, frequent keynote speaker, analyst, futurist, and transformation expert based in Washington, DC. He is currently Chief Strategy Officer at the industry-leading digital strategy and online community solutions firm, 7Summits.
Founded in 2000, Chetu Inc. is a global provider of customized software development solutions and IT staff augmentation services for software technology providers. By providing clients with unparalleled niche technology expertise and industry experience, Chetu has become the premiere long-term, back-end software development partner for start-ups, SMBs, and Fortune 500 companies. Chetu is headquartered in Plantation, Florida, with thirteen offices throughout the U.S. and abroad.
Bill Schmarzo, author of "Big Data: Understanding How Data Powers Big Business" and "Big Data MBA: Driving Business Strategies with Data Science," is responsible for setting the strategy and defining the Big Data service offerings and capabilities for EMC Global Services Big Data Practice. As the CTO for the Big Data Practice, he is responsible for working with organizations to help them identify where and how to start their big data journeys. He's written several white papers, is an avid blogge...