34
JOURNEY INTO THE WORLD OF JAVA: JAVA SERIALIZATION

Java serialization

Embed Size (px)

Citation preview

Page 1: Java serialization

JOURNEY INTO THE WORLD OF JAVA: JAVA SERIALIZATION

Page 2: Java serialization

public class Vehicle{

public String number = "";

public Vehicle(){

System.out.println("Vehicle::Vehicle()");

}

}public class Car extends Vehicle implements Serializable{

public String mark = "";

public String model = "";

public Car(){

System.out.println("Car::Car()");

}

public Car(String mark, String model){

System.out.println("Car::Car(String, String)");

this.mark = mark;

this.model = model;

}

}

Serializable

Page 3: Java serialization

public class Vehicle{

public String number = "";

public Vehicle(){

System.out.println("Vehicle::Vehicle()");

}

}

Serializable

Page 4: Java serialization

public class Car extends Vehicle implements Serializable{

public String mark = "";

public String model = "";

public Car(){

System.out.println("Car::Car()");

}

public Car(String mark, String model){

System.out.println("Car::Car(String, String)");

this.mark = mark;

this.model = model;

}

}

Serializable

Page 5: Java serialization

System.out.println("Creating...");

Car car = new Car("Zaz", "Forza");

car.number = "AA0001BP";

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

System.out.println("Serializing...");

objectOutputStream.writeObject(car);

objectOutputStream.flush();

byteArrayOutputStream.flush();

objectOutputStream.close();

byteArrayOutputStream.close();

ByteArrayInputStream bais = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bais);

System.out.println("Deserializing...");

Car car2 = (Car)ois.readObject();

System.out.println("car2.number=" + car2.number);

System.out.println("car2.mark=" + car2.mark);

System.out.println("car2.model=" + car2.model);

Serializable

Page 6: Java serialization

System.out.println("Creating...");

Car car = new Car("Zaz", "Forza");

car.number = "AA0001BP";

Serializable

Page 7: Java serialization

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

System.out.println("Serializing...");

objectOutputStream.writeObject(car);

objectOutputStream.flush();

byteArrayOutputStream.flush();

objectOutputStream.close();

byteArrayOutputStream.close();

Serializable

Page 8: Java serialization

ByteArrayInputStream bais = new

ByteArrayInputStream(byteArrayOutputStream.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bais);

System.out.println("Deserializing...");

Car car2 = (Car)ois.readObject();

System.out.println("car2.number=" + car2.number);

System.out.println("car2.mark=" + car2.mark);

System.out.println("car2.model=" + car2.model);

Serializable

Page 9: Java serialization

Creating... Vehicle::Vehicle() Car::Car(String, String) Serializing... Deserializing... Vehicle::Vehicle() car2.number= car2.mark=Zaz car2.model=Forza

Serializable

Page 10: Java serialization

Serializable. Secure private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException; private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException,

ClassNotFoundException; private void java.io.ObjectInputStream.defaultWriteObject(java.io.ObjectOutputStream stream)

throws java.io.IOException; private void java.io.ObjectInputStream.defaultReadObject(java.io.ObjectInputStream stream)

throws java.io.IOException, ClassNotFoundException;

public interface java.io.ObjectInputValidation { public void validateObject() throws InvalidObjectException; }

Page 11: Java serialization

Serializable. Features public class ArrayList extends AbstractList implements List,

Cloneable,Serializable {

private transient Object elementData[];

private int size;

...

}

class List implements Serializable {

List next;

private static final ObjectStreamField[] serialPersistentFields

= {new ObjectStreamField("next", List.class)}

};

Page 12: Java serialization

• Adding new fields to a class • Changing the fields from static to nonstatic • Changing the fields from transient to nontransient

Serializable. Can Manage Automatically

private static final long serialVersionUID = 3329999866918906824L;

Page 13: Java serialization

private/public/protected Object readResolve() throws ObjectStreamException private/public/protected Object writeReplace() throws ObjectStreamException

Serializable. Singleton

Page 14: Java serialization

Serializable. Singleton public class Singleton implements Serializable {

private static final long serialVersionUID = 8413502725007695828L;

private static Singleton instance = null;

public String name = "";

private Singleton(){};

public static Singleton getInstance(){

if (instance == null){

instance = new Singleton();

}

return instance;

}

private Object readResolve() throws ObjectStreamException{

instance.name = this.name;

return instance;

}

}

Page 15: Java serialization

Serializable. Singleton

private Object readResolve() throws ObjectStreamException{

instance.name = this.name;

return instance;

}

}

Page 16: Java serialization

Serializable. Singleton

Singleton instance1 = Singleton.getInstance();

instance1.name = "instance1";

............................................................................

System.out.println("Serializing...");

System.out.println("instance1.name:" + instance1.name);

..............................................................................

objectOutputStream.writeObject(instance1);

............................................................................

instance1.name = "instance2";

............................................................................

System.out.println("Deserializing...");

Singleton instance2 = (Singleton)ois.readObject();

if(instance1 == instance2){

System.out.println("instance1 == instance2");

}else{

System.out.println("instance1 != instance2");

}

System.out.println("instance2.name:" + instance2.name);

Page 17: Java serialization

Serializable. Singleton

Singleton instance1 = Singleton.getInstance();

instance1.name = "instance1";

............................................................................

System.out.println("Serializing...");

System.out.println("instance1.name:" + instance1.name);

..............................................................................

objectOutputStream.writeObject(instance1);

............................................................................

instance1.name = "instance2";

Page 18: Java serialization

Serializable. Singleton

............................................................................

System.out.println("Deserializing...");

Singleton instance2 = (Singleton)ois.readObject();

if(instance1 == instance2){

System.out.println("instance1 == instance2");

}else{

System.out.println("instance1 != instance2");

}

System.out.println("instance2.name:" + instance2.name);

Page 19: Java serialization

Serializable. Singleton Serializing... instance1.name:instance1 Deserializing... instance1 == instance2 instance2.name:instance1

Page 20: Java serialization

Serializable. ENUM

public enum Color {

RED("red"),GREEN("green"),BLUE("blue");

private Color(String name){

this.name = name;

}

public String getName(){

return name;

}

private String name;

}

Page 21: Java serialization

Serializable. ENUM

Color red1 = Color.RED;Color green1 = Color.GREEN;Color blue1 = Color.BLUE;

.....................................

System.out.println("Serializing...");

objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

objectOutputStream.writeObject(red1);

objectOutputStream.writeObject(green1);

objectOutputStream.writeObject(blue1);

.....................................

System.out.println("Deserializing...");

Color red2 = (Color)ois.readObject();

Color green2 = (Color)ois.readObject();

Color blue2 = (Color)ois.readObject(); if(red1 == red2) System.out.println("red1 == red2");

if(green1 == green2) System.out.println("green1 == green2");

if(blue1 == blue2) System.out.println("blue1 == blue2");

Page 22: Java serialization

Serializable. ENUM

Color red1 = Color.RED;

Color green1 = Color.GREEN;

Color blue1 = Color.BLUE;

.....................................

System.out.println("Serializing...");

objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

objectOutputStream.writeObject(red1);

objectOutputStream.writeObject(green1);

objectOutputStream.writeObject(blue1);

Page 23: Java serialization

Serializable. ENUM

.....................................

System.out.println("Deserializing...");

Color red2 = (Color)ois.readObject();

Color green2 = (Color)ois.readObject();

Color blue2 = (Color)ois.readObject();

if(red1 == red2) System.out.println("red1 == red2");

if(green1 == green2) System.out.println("green1 == green2");

if(blue1 == blue2) System.out.println("blue1 == blue2");

Page 24: Java serialization

Serializable. ENUM

Serializing... Deserializing... red1 == red2 green1 == green2 blue1 == blue2

Page 25: Java serialization

Serializable. ENUM

writeObject writeReplace serialPersistentFields serialVersionUID

Page 26: Java serialization

public interface Externalizable extends java.io.Serializable {

void writeExternal(ObjectOutput out) throws IOException;

void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;

}

Externalizable

Page 27: Java serialization

Externalizable. Performance public class ItemExt implements Externalizable{ private int fieldInt; private boolean fieldBoolean; private long fieldLong; private float fieldFloat; private double fieldDouble; private String fieldString; public ItemExt(){ this(0,true,0,0,0,""); } ..................................................

Page 28: Java serialization

Externalizable. Performance public void writeExternal(ObjectOutput out) throws IOException {

out.writeInt(fieldInt);

out.writeBoolean(fieldBoolean);

out.writeLong(fieldLong);

out.writeFloat(fieldFloat);

out.writeDouble(fieldDouble);

out.writeUTF(fieldString);

}

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {

fieldInt = in.readInt();

fieldBoolean = in.readBoolean();

fieldLong = in.readLong();

fieldFloat = in.readFloat();

fieldDouble = in.readDouble();

fieldString = in.readUTF();

}

Page 29: Java serialization

Externalizable. Performance

public abstract class ContainerExt implements Externalizable{

protected List<ItemExt> items;

public ContainerExt(){

items = new LinkedList<ItemExt>();

}

public void addItem(ItemExt item){

items.add(item);

}

..................................................

}

Page 30: Java serialization

/*ContainerExt1*/public void writeExternal(ObjectOutput out) throws IOException {

out.writeObject(items);

}

public void readExternal(ObjectInput in) throws

IOException, ClassNotFoundException {

items = (List<ItemExt>)in.readObject();

}

Externalizable. Performance

Page 31: Java serialization

Externalizable. Performance /*ContainerExt2*/

public void writeExternal(ObjectOutput out) throws IOException {

out.writeInt(items.size());

for(Externalizable ext : items)

out.writeObject(ext);

}

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {

int count = in.readInt();

for(int i=0; i<count; i++){

ItemExt ext = (ItemExt)in.readObject();

items.add(ext);

}

}

Page 32: Java serialization

/*ContainerExt3*/

public void writeExternal(ObjectOutput out) throws IOException {

out.writeInt(items.size());

for(Externalizable ext : items)

ext.writeExternal(out);

}

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException{

int count = in.readInt();

for(int i=0; i<count; i++){

ItemExt ext = new ItemExt();

ext.readExternal(in);

items.add(ext);

}

}

Externalizable. Performance

Page 33: Java serialization

[java] Creating 100000 objects [java] Serializable: written in 971ms, readed in 1353 [java] Externalizable1: written in 1026ms, readed in 1129 [java] Externalizable2: written in 909ms, readed in 1876 [java] Externalizable3: written in 49ms, readed in 268 06/16/2013 08:24 PM 5,547,651 cont.ser 06/16/2013 08:24 PM 5,747,559 contExt1.ser 06/16/2013 08:24 PM 5,747,521 contExt2.ser 06/16/2013 08:24 PM 4,871,155 contExt3.ser

Externalizable. Performance

Page 34: Java serialization

https://github.com/MikhailGevak/Serialize