Return to Snippet

Revision: 64540
at August 20, 2013 10:17 by rnavanee


Updated Code
package com.test.jvm;

import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

public class ExternalizableTest {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		MyTestObject testObj = new MyTestObject();
		testObj.setL(12345678L);
		testObj.setS("hello");
		
		// Serialize object
		FileOutputStream fos = new FileOutputStream("obj.ser");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(testObj);
		
		// Deserialize object
		FileInputStream fis = new FileInputStream("obj.ser");
		ObjectInputStream ois = new ObjectInputStream(fis);
		MyTestObject objRead = (MyTestObject)ois.readObject();
		System.out.println("objRead: s="+objRead.getS()+", l="+objRead.getL());
	}

}

class MyTestObject implements Externalizable {
	private String s;
	private long l;
	
	public MyTestObject() {
	}
	
	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}

	public long getL() {
		return l;
	}

	public void setL(long l) {
		this.l = l;
	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		out.writeObject(this.s);
		out.writeLong(this.l);
		System.out.println("writeExternal complete");
	}

	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		this.s = (String) in.readObject();
		this.l = in.readLong();
		System.out.println("readExternal complete");
	}
}



/*
#1:
Output:
writeExternal complete
readExternal complete
objRead: s=hello, l=12345678


#2:
If the no-arg constructor of MyTestObject is commented out, you'll get the below error:
Exception in thread "main" java.io.InvalidClassException: com.test.jvm.MyTestObject; com.test.jvm.MyTestObject; no valid constructor
	at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:724)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1744)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:362)
	at com.test.jvm.ExternalizableTest.main(ExternalizableTest.java:27)
Caused by: java.io.InvalidClassException: com.test.jvm.MyTestObject; no valid constructor
	at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:482)
	at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:321)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1117)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:337)
	at com.test.jvm.ExternalizableTest.main(ExternalizableTest.java:22)

*/

Revision: 64539
at August 20, 2013 10:13 by rnavanee


Initial Code
package com.test.jvm;

import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

public class ExternalizableTest {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		MyTestObject testObj = new MyTestObject();
		testObj.setL(12345678L);
		testObj.setS("hello");
		
		// Serialize object
		FileOutputStream fos = new FileOutputStream("obj.ser");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(testObj);
		
		// Deserialize object
		FileInputStream fis = new FileInputStream("obj.ser");
		ObjectInputStream ois = new ObjectInputStream(fis);
		MyTestObject objRead = (MyTestObject)ois.readObject();
		System.out.println("objRead: s="+objRead.getS()+", l="+objRead.getL());
	}

}

class MyTestObject implements Externalizable {
	private String s;
	private long l;
	
	public MyTestObject() {
	}
	
	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}

	public long getL() {
		return l;
	}

	public void setL(long l) {
		this.l = l;
	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		out.writeObject(this.s);
		out.writeLong(this.l);
		System.out.println("writeExternal complete");
	}

	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		this.s = (String) in.readObject();
		this.l = in.readLong();
		System.out.println("readExternal complete");
	}
}

Initial URL
http://www.dzone.com/links/r/optimizing_java_serialization_java_vs_xml_vs_json.html

Initial Description
Externalizable interface provides you an alternate to Serializable interface. In Externalizable, you specify how/what to persist. 

Seralizable persists all non-transient elements using default serialize/deserialize implementation.

Initial Title
Externalizable Example

Initial Tags
java

Initial Language
Java