19
Serialization in Java Critical for Java network abilities

Java Serialization

  • Upload
    jeslie

  • View
    2.680

  • Download
    0

Embed Size (px)

DESCRIPTION

Simple introduction to the core concepts of serialization in Java and how to add serialization to any Java class

Citation preview

Page 1: Java Serialization

Serialization in JavaSerialization in Java

Critical for Java network abilities

Jeslie Chermak ([email protected])

Critical for Java network abilities

Jeslie Chermak ([email protected])

Page 2: Java Serialization

What is “serialization”?What is “serialization”?• Serialization is the (reversible) encoding

of objects, and the objects reachable in them, into a stream of bytes. It is by no means unique to Java: http://en.wikipedia.org/wiki/Serialization

• This talk is based on information from http://download.oracle.com/javase/tutorial/essential/io/objectstreams.html

• Serialization is the (reversible) encoding of objects, and the objects reachable in them, into a stream of bytes. It is by no means unique to Java: http://en.wikipedia.org/wiki/Serialization

• This talk is based on information from http://download.oracle.com/javase/tutorial/essential/io/objectstreams.html

Page 3: Java Serialization

Why Should I Use It?Why Should I Use It?• BASIS FOR ALL PERSISTENCE IN

JAVA!

• Simple to add to most classes.• Allows for easy extension.• Handles versioning.

• BASIS FOR ALL PERSISTENCE IN JAVA!

• Simple to add to most classes.• Allows for easy extension.• Handles versioning.

Page 4: Java Serialization

Simple ClassSimple Class

• Create a new class in package com.jcc.training.generics

• Class will implement a traditional “stack” containing Integers

• Only methods are push, pop, top• Allow NULLs in stack

• Create a new class in package com.jcc.training.generics

• Class will implement a traditional “stack” containing Integers

• Only methods are push, pop, top• Allow NULLs in stack

Page 5: Java Serialization

Java 1.4 ImplementationJava 1.4 Implementationpackage com.jcc.training.generics;

import java.util.ArrayList;import java.util.List;

public class Stack { private final List stack = new ArrayList(); public void push(final Integer value) { this.stack.add(value); // NULL

allowed! } public Integer top() { if (this.stack.isEmpty()) throw new IllegalStateException(); return (Integer) this.stack.get(this.stack.size() - 1); } public Integer pop() { final Integer value = this.top(); this.stack.remove(this.stack.size() - 1); return value; }}

package com.jcc.training.generics;

import java.util.ArrayList;import java.util.List;

public class Stack { private final List stack = new ArrayList(); public void push(final Integer value) { this.stack.add(value); // NULL

allowed! } public Integer top() { if (this.stack.isEmpty()) throw new IllegalStateException(); return (Integer) this.stack.get(this.stack.size() - 1); } public Integer pop() { final Integer value = this.top(); this.stack.remove(this.stack.size() - 1); return value; }}

Page 6: Java Serialization

WIBNIFWIBNIF

• Problem: How do we make this class serializable?

• Solution: Use a special “marker” interface -- Serializable

• Problem: How do we make this class serializable?

• Solution: Use a special “marker” interface -- Serializable

Page 7: Java Serialization

Java 1.4 ImplementationJava 1.4 Implementationpackage com.jcc.training.generics;

import java.util.ArrayList;import java.util.List;

public class Stack implements java.io.Serializable { // marker interface private final List stack = new ArrayList(); public void push(final Integer value) { this.stack.add(value); // NULL

allowed! } public Integer top() { if (this.stack.isEmpty()) throw new IllegalStateException(); return (Integer) this.stack.get(this.stack.size() - 1); } public Integer pop() { final Integer value = this.top(); this.stack.remove(this.stack.size() - 1); return value; }}

package com.jcc.training.generics;

import java.util.ArrayList;import java.util.List;

public class Stack implements java.io.Serializable { // marker interface private final List stack = new ArrayList(); public void push(final Integer value) { this.stack.add(value); // NULL

allowed! } public Integer top() { if (this.stack.isEmpty()) throw new IllegalStateException(); return (Integer) this.stack.get(this.stack.size() - 1); } public Integer pop() { final Integer value = this.top(); this.stack.remove(this.stack.size() - 1); return value; }}

Page 8: Java Serialization

WIBNIFWIBNIF

• Problem: Java has evolved since 1.4

• Solution: Serialization has been present since initial public release (1.0.2) -- it is a core feature of the language implementation

• Problem: Java has evolved since 1.4

• Solution: Serialization has been present since initial public release (1.0.2) -- it is a core feature of the language implementation

Page 9: Java Serialization

Java 5 with GenericsJava 5 with Genericspackage com.jcc.training.generics;

import java.io.Serializable; // missing earlierimport java.util.ArrayList;import java.util.List;

public class Stack implements Serializable { // marker interface private final List<Integer> stack = new ArrayList<Integer>(); // field typed! public void push(final Integer value) { this.stack.add(value); // NULL allowed! } public Integer top() { if (this.stack.isEmpty()) throw new IllegalStateException(); return this.stack.get(this.stack.size() - 1); // no cast! } public Integer pop() { final int value = this.top(); // OOPS! this.stack.remove(this.stack.size() - 1); return value; }}

package com.jcc.training.generics;

import java.io.Serializable; // missing earlierimport java.util.ArrayList;import java.util.List;

public class Stack implements Serializable { // marker interface private final List<Integer> stack = new ArrayList<Integer>(); // field typed! public void push(final Integer value) { this.stack.add(value); // NULL allowed! } public Integer top() { if (this.stack.isEmpty()) throw new IllegalStateException(); return this.stack.get(this.stack.size() - 1); // no cast! } public Integer pop() { final int value = this.top(); // OOPS! this.stack.remove(this.stack.size() - 1); return value; }}

Page 10: Java Serialization

WIBNIFWIBNIF

• Problem: classes evolve over time

• Solution: introduce a version UID to capture “real” changes

• Problem: classes evolve over time

• Solution: introduce a version UID to capture “real” changes

Page 11: Java Serialization

Improved and VersionedImproved and Versionedpackage com.jcc.training.generics;

import java.util.ArrayList;import java.util.List;

public class Stack<E> implements java.io.Serializable { // class typed!private static final long serialVersionUID = 1L; // we specified private final List<E> stack = new ArrayList<E>(); // typed by class public void push(final E value) { // typed by class

this.stack.add(value); // NULL allowed! } public E top() { // typed by class if (this.stack.isEmpty()) throw new IllegalStateException(); return this.stack.get(this.stack.size() - 1); } public E pop() { // typed by class final E value = this.top(); // typed by class this.stack.remove(this.stack.size() - 1); return value; }}

package com.jcc.training.generics;

import java.util.ArrayList;import java.util.List;

public class Stack<E> implements java.io.Serializable { // class typed!private static final long serialVersionUID = 1L; // we specified private final List<E> stack = new ArrayList<E>(); // typed by class public void push(final E value) { // typed by class

this.stack.add(value); // NULL allowed! } public E top() { // typed by class if (this.stack.isEmpty()) throw new IllegalStateException(); return this.stack.get(this.stack.size() - 1); } public E pop() { // typed by class final E value = this.top(); // typed by class this.stack.remove(this.stack.size() - 1); return value; }}

Page 12: Java Serialization

WIBNIFWIBNIF

• Problem: some code lacks the UID

• Solution: define default UID to match that normally built in a class -- serialver program

• Problem: some code lacks the UID

• Solution: define default UID to match that normally built in a class -- serialver program

Page 13: Java Serialization

Good NewsGood News

• Most (all?) IDEs provide a serialver hook

• Writing simple objects is easy• Reading objects is comparable

• Most (all?) IDEs provide a serialver hook

• Writing simple objects is easy• Reading objects is comparable

Page 14: Java Serialization

Object I/OObject I/O

• Writing:public void writeIt(OutputStream os, Foo foo) {

ObjectOutputStream oos = new ObjectOutputStream(os);oos.writeObject(foo);

oos.close();}

• Reading:public Foo readIt(InputStream is) {

ObjectInputStream ois = new ObjectInputStream(is);Foo foo = (Foo) ois.readObject();

ois.close();return foo;

}

• Writing:public void writeIt(OutputStream os, Foo foo) {

ObjectOutputStream oos = new ObjectOutputStream(os);oos.writeObject(foo);

oos.close();}

• Reading:public Foo readIt(InputStream is) {

ObjectInputStream ois = new ObjectInputStream(is);Foo foo = (Foo) ois.readObject();

ois.close();return foo;

}

Page 15: Java Serialization

WIBNIFWIBNIF

• Problem: not every field should be serialized

• Solution: transient fields• Problem: static fields are the

same for each object instance• Solution: they are not written by

default

• Problem: not every field should be serialized

• Solution: transient fields• Problem: static fields are the

same for each object instance• Solution: they are not written by

default

Page 16: Java Serialization

Bad NewsBad News

• Default readObject() and writeObject() methods may not properly handle objects with transient and/or static fields

• Default readObject() and writeObject() methods may not properly handle objects with transient and/or static fields

Page 17: Java Serialization

Good NewsGood News

• Object.readObject() and Object.writeObject() methods (used in default handling) are overloadable: private void readObject(ObjectInputStream)

throws IOException, ClassNotFoundException;private void writeObject(ObjectOutputStream)

throws IOException;

• Object.readObject() and Object.writeObject() methods (used in default handling) are overloadable: private void readObject(ObjectInputStream)

throws IOException, ClassNotFoundException;private void writeObject(ObjectOutputStream)

throws IOException;

Page 18: Java Serialization

Better NewsBetter News

• When default handling is insufficient, use the Externalizable interface instead of Serializable and implement readExternal() and writeExternal() -- a lot more work for total control of serialization

• When default handling is insufficient, use the Externalizable interface instead of Serializable and implement readExternal() and writeExternal() -- a lot more work for total control of serialization

Page 19: Java Serialization

Going Further …Going Further …

• Java tutorials: http://download.oracle.com/javase/tutorial/index.html

• Serialization in depth w/examples: http://download.oracle.com/javase/7/docs/technotes/guides/serialization/index.html

• Object streams: http://download.oracle.com/javase/tutorial/essential/io/objectstreams.html

• Google “java serialization”

• Java tutorials: http://download.oracle.com/javase/tutorial/index.html

• Serialization in depth w/examples: http://download.oracle.com/javase/7/docs/technotes/guides/serialization/index.html

• Object streams: http://download.oracle.com/javase/tutorial/essential/io/objectstreams.html

• Google “java serialization”