Customer has send the data as serialized object to us, where as I am not interested in all the data or the class which serialized, or I have to create a class in which I can add aditional data in it.
We could do this operation by fetching the object and handing over to some method to create a new Object from it. It is painstaking job, and will not produce nice implmentation approach
We can achive resolving object by creating sub-class for ObjectInputStream with overriding method resolveObject(Object). In this method, we can do our business related sutff and get the objected wanted while deserializing
Example
I have created sub-class MyObjectInputStream from ObjectInputStream and override the resolve method. Note: resolveObject() method will not be called until unless the resolveObject flag set to true by calling method enableResolveObject(true);. I am setting this value true in constructor of the MyObjectInputStream class.
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class DeserializeTest {
public static class EmployeeBean implements Serializable
{
String name;
String designation;
}
private static class MyObjectInputStream extends ObjectInputStream
{
public MyObjectInputStream(InputStream in) throws IOException {
super(in);
enableResolveObject(true);
}
@Override
protected Object resolveObject(Object obj) throws IOException {
if (obj instanceof EmployeeBean) {
EmployeeBean new_name = (EmployeeBean) obj;
StringBuffer sb=new StringBuffer();
sb.append(new_name.name);
sb.append(" ");
sb.append(new_name.designation);
return sb;
}
return super.resolveObject(obj);
}
}
/**
* @param args
*/
public static void main(String[] args) throws Exception{
EmployeeBean emp=new EmployeeBean();
emp.name = "Krishna";
emp.designation="PMTS";
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream out= new ObjectOutputStream(bos);
out.writeObject(emp);
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
MyObjectInputStream in= new MyObjectInputStream(bis);
Object obj=in.readObject();
System.out.println(obj);
}
}
The Output will be like below
Krishna PMTS
In the above program comment enableResolveObject(true); line and try, the output will be the Object reference of EmployeeBeen; Something like below
ObjectStreamClassTest$EmployeeBean@10b30a7
Note: Playing with ObjectInputStream ,ObjectOutputStream, and ObjectStreamClass, we can do lot and control the content of serialized stream.
No comments:
Post a Comment