By implementing the Serializable interface we can use Java default serializable.
However we can customize the serialization process by implementing writeObject() and/or readObject() methods.
These methods are not overridden Because we are actually not overriding anything: The JVM checks and calls these methods by the means of reflection.
import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInputValidation;
import java.io.ObjectStreamException;
import java.io.Serializable;
public class Pojo implements Serializable, ObjectInputValidation {
public Pojo(String msg) {
this.msg = msg;
}
private String msg;
private void writeObject(java.io.ObjectOutputStream out)
throws IOException {
System.out.println("writeObject");
out.defaultWriteObject();
}
private Object writeReplace() throws ObjectStreamException {
System.out.println("writeReplace");
return this;
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
System.out.println("readObject");
in.registerValidation(this, 0);
in.defaultReadObject();
}
@Override
public void validateObject() throws InvalidObjectException {
System.out.println("validateObject");
}
private Object readResolve() throws ObjectStreamException {
System.out.println("readResolve");
return this;
}
public String getMsg() {
return msg;
}
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class CustomSerialiazation {
public static void main(String[] args) throws Exception {
Pojo pojo = new Pojo("Hello world");
byte[] bytes = serialize(pojo); // Serialization
Pojo p = (Pojo) deserialize(bytes); // De-serialization
System.out.println(p.getMsg());
}
private static byte[] serialize(Object o) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(o);
oos.flush();
oos.close();
return baos.toByteArray();
}
private static Object deserialize(byte[] bytes)
throws ClassNotFoundException, IOException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
Object o = ois.readObject();
ois.close();
return o;
}
}
No comments:
Post a Comment