Lab 09: Serialization & Binary Protocols

Objective

Master Java object serialization: ObjectOutputStream/ObjectInputStream, transient/static fields, custom writeObject/readObject hooks, manual binary protocol with DataOutputStream, GZIP compression, and serialVersionUID compatibility.

Background

Java serialization converts object graphs to byte streams for persistence or network transport. The Serializable marker interface enables it. transient fields are excluded; static fields are class-level (not instance state). For performance-critical paths, manual binary encoding with DataOutputStream produces much smaller payloads and is 4–10x faster.

Time

25 minutes

Prerequisites

  • Lab 07 (NIO Channels)

Tools

  • Docker: zchencow/innozverse-java:latest


Lab Instructions

Steps 1–8: Object serialization, transient/static, custom writeObject, binary protocol, compression, file persistence, serialVersionUID, Capstone

💡 serialVersionUID = 1L must match across versions. If you add a field to a serialized class without declaring serialVersionUID, the JVM auto-computes it from the class structure — and the new value won't match old data, causing InvalidClassException. Always declare serialVersionUID explicitly, increment it intentionally when you make breaking changes, and use readObject to handle migration gracefully.

📸 Verified Output:


Summary

Mechanism
Bytes
Speed
Portable

Java serialization

~4x data

Slow

Java only

Manual binary (DataOutputStream)

~1x data

Fast

Any language

JSON

~3x data

Medium

Universal

Java serial + GZIP

~1.5x data

Medium

Java only

Further Reading

Last updated