JOURNEY INTO THE WORLD OF JAVA:
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
public class Vehicle{
public String number = "";
public Vehicle(){
System.out.println("Vehicle::Vehicle()");
}
}
Serializable
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
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
System.out.println("Creating...");
Car car = new Car("Zaz", "Forza");
car.number = "AA0001BP";
Serializable
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
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
Creating...
Vehicle::Vehicle()
Car::Car(String, String)
Serializing...
Deserializing...
Vehicle::Vehicle()
car2.number=
car2.mark=Zaz
car2.model=Forza
Serializable
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;
}
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)}
};
• 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;
private/public/protected Object readResolve() throws ObjectStreamException
private/public/protected Object writeReplace() throws ObjectStreamException
Serializable. Singleton
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;
}
}
Serializable. Singleton
private Object readResolve() throws ObjectStreamException{
instance.name = this.name;
return instance;
}
}
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);
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";
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);
Serializable. Singleton
Serializing...
instance1.name:instance1
Deserializing...
instance1 == instance2
instance2.name:instance1
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;
}
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");
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);
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");
Serializable. ENUM
Serializing...
Deserializing...
red1 == red2
green1 == green2
blue1 == blue2
Serializable. ENUM
writeObject
writeReplace
serialPersistentFields
serialVersionUID
public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
Externalizable
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,"");
}
..................................................
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();
}
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);
}
..................................................
}
/*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
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);
}
}
/*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
[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
https://github.com/MikhailGevak/Serialize

Java serialization

  • 1.
    JOURNEY INTO THEWORLD OF JAVA: JAVA SERIALIZATION
  • 2.
    public class Vehicle{ publicString 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
  • 3.
    public class Vehicle{ publicString number = ""; public Vehicle(){ System.out.println("Vehicle::Vehicle()"); } } Serializable
  • 4.
    public class Carextends 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
  • 5.
    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
  • 6.
    System.out.println("Creating..."); Car car =new Car("Zaz", "Forza"); car.number = "AA0001BP"; Serializable
  • 7.
    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
  • 8.
    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
  • 9.
  • 10.
    Serializable. Secure private voidwriteObject(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; }
  • 11.
    Serializable. Features public classArrayList 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)} };
  • 12.
    • Adding newfields 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;
  • 13.
    private/public/protected Object readResolve()throws ObjectStreamException private/public/protected Object writeReplace() throws ObjectStreamException Serializable. Singleton
  • 14.
    Serializable. Singleton public classSingleton 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; } }
  • 15.
    Serializable. Singleton private ObjectreadResolve() throws ObjectStreamException{ instance.name = this.name; return instance; } }
  • 16.
    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);
  • 17.
    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";
  • 18.
    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);
  • 19.
  • 20.
    Serializable. ENUM public enumColor { RED("red"),GREEN("green"),BLUE("blue"); private Color(String name){ this.name = name; } public String getName(){ return name; } private String name; }
  • 21.
    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");
  • 22.
    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);
  • 23.
    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");
  • 24.
  • 25.
  • 26.
    public interface Externalizableextends java.io.Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; } Externalizable
  • 27.
    Externalizable. Performance public classItemExt 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,""); } ..................................................
  • 28.
    Externalizable. Performance public voidwriteExternal(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(); }
  • 29.
    Externalizable. Performance public abstractclass ContainerExt implements Externalizable{ protected List<ItemExt> items; public ContainerExt(){ items = new LinkedList<ItemExt>(); } public void addItem(ItemExt item){ items.add(item); } .................................................. }
  • 30.
    /*ContainerExt1*/public void writeExternal(ObjectOutputout) throws IOException { out.writeObject(items); } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { items = (List<ItemExt>)in.readObject(); } Externalizable. Performance
  • 31.
    Externalizable. Performance /*ContainerExt2*/ public voidwriteExternal(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); } }
  • 32.
    /*ContainerExt3*/ public void writeExternal(ObjectOutputout) 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
  • 33.
    [java] Creating 100000objects [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
  • 34.