Serialization is the process of saving an object's state to a sequence of bytes; deserialization is the process of rebuilding those bytes into a live object. The Java Serialization API provides a standard mechanism for developers to handle object serialization. In this tip, you will see how to serialize an object, and why serialization is sometimes necessary. You'll learn about the serialization algorithm used in Java, and see an example that illustrates the serialized format of an object. By the time you're done, you should have a solid knowledge of how the serialization algorithm works and what entities are serialized as part of the object at a low level.
In today's world, a typical enterprise application will have multiple components and will be distributed across various systems and networks. In Java, everything is represented as objects; if two Java components want to communicate with each other, there needs be a mechanism to exchange data. One way to achieve this is to define your own protocol and transfer an object. This means that the receiving end must know the protocol used by the sender to re-create the object, which would make it very difficult to talk to third-party components. Hence, there needs to be a generic and efficient protocol to transfer the object between components. Serialization is defined for this purpose, and Java components use this protocol to transfer objects.
Figure 1 shows a high-level view of client/server communication, where an object is transferred from the client to the server through serialization.
In order to serialize an object, you need to ensure that the class of the object implements the java.io.Serializable interface, as shown in Listing 1.
import java.io.Serializable;
class TestSerial implements Serializable {
public byte version = 100;
public byte count = 0;
}
In Listing 1, the only thing you had to do differently from creating a normal class is implement the java.io.Serializable interface. The Serializable interface is a marker interface; it declares no methods at all. It tells the serialization mechanism that the class can be serialized.
Now that you have made the class eligible for serialization, the next step is to actually serialize the object. That is done by calling the writeObject() method of the java.io.ObjectOutputStream class, as shown in Listing 2.
public static void main(String args[]) throws IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
TestSerial ts = new TestSerial();
oos.writeObject(ts);
oos.flush();
oos.close();
}
Listing 2 stores the state of the TestSerial object in a file called temp.out. oos.writeObject(ts); actually kicks off the serialization algorithm, which in turn writes the object to temp.out.
To re-create the object from the persistent file, you would employ the code in Listing 3.
public static void main(String args[]) throws IOException {
FileInputStream fis = new FileInputStream("temp.out");
ObjectInputStream oin = new ObjectInputStream(fis);
TestSerial ts = (TestSerial) oin.readObject();
System.out.println("version="+ts.version);
}
In Listing 3, the object's restoration occurs with the oin.readObject() method call. This method call reads in the raw bytes that we previously persisted and creates a live object that is an exact replica of the original object graph. Because readObject() can read any serializable object, a cast to the correct type is required.
Executing this code will print version=100 on the standard output.
What does the serialized version of the object look like? Remember, the sample code in the previous section saved the serialized version of the TestSerial object into the file temp.out. Listing 4 shows the contents of temp.out, displayed in hexadecimal. (You need a hexadecimal editor to see the output in hexadecimal format.)
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
If you look again at the actual TestSerial object, you'll see that it has only two byte members, as shown in Listing 5.
public byte version = 100;
public byte count = 0;
The size of a byte variable is one byte, and hence the total size of the object (without the header) is two bytes. But if you look at the size of the serialized object in Listing 4, you'll see 51 bytes. Surprise! Where did the extra bytes come from, and what is their significance? They are introduced by the serialization algorithm, and are required in order to to re-create the object. In the next section, you'll explore this algorithm in detail.
By now, you should have a pretty good knowledge of how to serialize an object. But how does the process work under the hood? In general the serialization algorithm does the following:
java.lang.object.I've written a different example object for this section that will cover all possible cases. The new sample object to be serialized is shown in Listing 6.
class parent implements Serializable {
int parentVersion = 10;
}
class contain implements Serializable{
int containVersion = 11;
}
public class SerialTest extends parent implements Serializable {
int version = 66;
contain con = new contain();
public int getVersion() {
return version;
}
public static void main(String args[]) throws IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
SerialTest st = new SerialTest();
oos.writeObject(st);
oos.flush();
oos.close();
}
}
This example is a straightforward one. It serializes an object of type SerialTest, which is derived from parent and has a container object, contain. The serialized format of this object is shown in Listing 7.
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07
76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09
4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
70 00 00 00 0B
Figure 2 offers a high-level look at the serialization algorithm for this scenario.
Let's go through the serialized format of the object in detail and see what each byte represents. Begin with the serialization protocol information:
AC ED: STREAM_MAGIC. Specifies that this is a serialization protocol.00 05: STREAM_VERSION. The serialization version.0x73: TC_OBJECT. Specifies that this is a new Object.The first step of the serialization algorithm is to write the description of the class associated with an instance. The example serializes an object of type SerialTest, so the algorithm starts by writing the description of the SerialTest class.
0x72: TC_CLASSDESC. Specifies that this is a new class.00 0A: Length of the class name.53 65 72 69 61 6c 54 65 73 74: SerialTest, the name of the class.05 52 81 5A AC 66 02 F6: SerialVersionUID, the serial version identifier of this class.0x02: Various flags. This particular flag says that the object supports serialization.00 02: Number of fields in this class.Next, the algorithm writes the field int version = 66;.
0x49: Field type code. 49 represents "I", which stands for Int.00 07: Length of the field name.76 65 72 73 69 6F 6E: version, the name of the field.And then the algorithm writes the next field, contain con = new contain();. This is an object, so it will write the canonical JVM signature of this field.
0x74: TC_STRING. Represents a new string.00 09: Length of the string.4C 63 6F 6E 74 61 69 6E 3B: Lcontain;, the canonical JVM signature.0x78: TC_ENDBLOCKDATA, the end of the optional block data for an object.The next step of the algorithm is to write the description of the parent class, which is the immediate superclass of SerialTest.
0x72: TC_CLASSDESC. Specifies that this is a new class.00 06: Length of the class name.70 61 72 65 6E 74: SerialTest, the name of the class0E DB D2 BD 85 EE 63 7A: SerialVersionUID, the serial version identifier of this class.0x02: Various flags. This flag notes that the object supports serialization.00 01: Number of fields in this class.Now the algorithm will write the field description for the parent class. parent has one field, int parentVersion = 100;.
0x49: Field type code. 49 represents "I", which stands for Int.00 0D: Length of the field name.70 61 72 65 6E 74 56 65 72 73 69 6F 6E: parentVersion, the name of the field.0x78: TC_ENDBLOCKDATA, the end of block data for this object.0x70: TC_NULL, which represents the fact that there are no more superclasses because we have reached the top of the class hierarchy.So far, the serialization algorithm has written the description of the class associated with the instance and all its superclasses. Next, it will write the actual data associated with the instance. It writes the parent class members first:
00 00 00 0A: 10, the value of parentVersion.Then it moves on to SerialTest.
00 00 00 42: 66, the value of version.
The next few bytes are interesting. The algorithm needs to write the information about the contain object, shown in Listing 8.
contain con = new contain();
Remember, the serialization algorithm hasn't written the class description for the contain class yet. This is the opportunity to write this description.
0x73: TC_OBJECT, designating a new object.0x72: TC_CLASSDESC.00 07: Length of the class name.63 6F 6E 74 61 69 6E: contain, the name of the class.FC BB E6 0E FB CB 60 C7: SerialVersionUID, the serial version identifier of this class.0x02: Various flags. This flag indicates that this class supports serialization.00 01: Number of fields in this class.Next, the algorithm must write the description for contain's only field, int containVersion = 11;.
0x49: Field type code. 49 represents "I", which stands for Int.00 0E: Length of the field name.63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E: containVersion, the name of the field.0x78: TC_ENDBLOCKDATA.Next, the serialization algorithm checks to see if contain has any parent classes. If it did, the algorithm would start writing that class; but in this case there is no superclass for contain, so the algorithm writes TC_NULL.
0x70: TC_NULL.Finally, the algorithm writes the actual data associated with contain.
00 00 00 0B: 11, the value of containVersion.In this tip, you have seen how to serialize an object, and learned how the serialization algorithm works in detail. I hope this article gives you more detail on what happens when you actually serialize an object.
Sathiskumar Palaniappan has more than four years of experience in the IT industry, and has been working with Java-related technologies for more than three years. Currently, he is working as a system software engineer at the Java Technology Center, IBM Labs. He also has experience in the telecom industry.
Excellent article!!!
Excellent article!!!
Good job!
I'm working on app that requires this algorithm. Thank you!
And I like this algorithm
And I like this algorithm very much, too easy for a newbie like me.
Ezine Directory Bee Directory | EZ Directory | Ezinez Directory
i agree with this comment.
i agree with this comment. IT does make it easier for a regular user like me. This will definitely help me in the future.
prepaid calling cards
I've never been one who
I've never been one who understood anything about serialization. Of course, I'll be the first to admit I probably haven't spent enough time in the past to try to understand it. Thanks for this in-depth post. philadelphia accident lawyer
There are on the Internet so
There are on the Internet so many sides nobody needs.
But this side is really interesting.
Many thanks for the share of the information.
Thanks,
Andreas
werbeartikel II werbegeschenke II online shops II logos erstellen II Sprachkurse II Homepage erstellen II PageRank erhöhen II Webdesign
Interesting post. I have
Interesting post. I have been wondering about this issue,so thanks for posting. I’ll likely be coming back to your blog. Kenali dan Kunjungi Objek Wisata di Pandeglang
Yeah, it's amazing that
Yeah, it's amazing that there's always so much more to learn. Even if you think you know something, chances are there is more to it than you realize. This is definitely a very in-depth explanation. bathroom wall panels
Hi comet discount
Hi
comet discount code
waterstones vouchers
dixons voucher code
symantec discount
debenhams voucher code
skybet
argos voucher
Bye
antique sideboard antique
antique sideboard
antique chair
antique porcelain
antique silver
antique furniture
antique chests of drawers
antique desks
antique dresser
antique armchair
antique table
antique pottery
Hi comet discount
Hi
comet discount code
waterstones vouchers
dixons voucher code
symantec discount
debenhams voucher code
skybet
argos voucher
Bye
antique bookcase antique
antique bookcase
antique armchair
antique dresser
antique sofa
antique cabinet
antique stand
antique bed
Re;
i agree with this comment.
Livescores
basketball live score
Tennis live scores
live football scores
live cricket score
yes i also agree with this
yes i also agree with this and great sharing thanks for this
Bleach
Naruto Shippuden
One Piece
that is a good article
that is a good article thanks for give this information
Very much agreed. This is an
Very much agreed. This is an impressive post that seems to have been put together with a lot of thought. I'm a pretty big newbie, too, so if I can follow it for the most part - anyone can! Fat Loss 4 Idiots Diet
slm
mirc indir-mirc download-çet-çet-sohbet
sohbet odaları gulum cet
gay chat
lez
lez sohbet
lezbiyen
gay Sohbet
gay chat
gabile
Lez sohbet
Bright article .
Bright article .
Agreed. dubai land
Agreed.
dubai land property
Dubai property sales
hotel marina dubai
this is so good and i
this is so good and i totally agree with you. This will definitely help me in the future. Jave is definitely the future.Il mio blog newyorkese
Code
Would you mind sharing the code once you're done with your app?
Debt Consolidation | Cash Advance | Women's Pumps Shoes | Personal Loans | Naturalizer Shoes Store
Re;
Great post
Essay
Term Paper
Research Paper
Essay Writing
Term Paper Writing
Research Paper Writing
Well done
Well defined snippet. Thanks for sharing
araba oyunları araba oyunları dress up games fighting games shooting games
It sure is. I've been trying
It sure is. I've been trying to find something that could put serialization kind of into laymen's terms and I finally came across this after a few hours of searching. florida custody laws
araba
bu bir denemedir
En Güzel Oyunlar -
Dövüş Oyunları -
komik oyunlar
çocu oyunları
yarış oyunları
macera oyunları
zeka oyunları
Gta oyunları -
Araba Oyunları -
Motorsiklet Oyunları -
Araba Süsleme Oyunları -
Araba Park Oyunları -
Araba Yarışı -
Bisiklet Oyunları
Kız Oyunları -
Barbie
Bratz
Giydirme
Makyaj
Sue
Oda
Yemek
Gelinlik
Kuafor
Winx
lazy eye surgery and
lazy eye surgery and asbestos removal
Same here. The Java
Same here. The Java Serialization API is a very handy thing to know, understand, and use. This post really helped me get a deeper understanding and will help me to be more productive, thank you. Toronto Real Estate Listings
Re;
thanks for sharing.
Buy Essay
Online Essay
Essay Writing Service
Essay Service
Essay Topics
Wow. I've read through this
Wow. I've read through this I don't know how many times and I just can't seem to wrap my brain around it. Maybe I need to come back in the morning after I've gotten a little sleep. Men's Swimwear
Post new comment