没有类定义的Map <string,object>的反序列化</string,object>

时间:2013-01-08 00:50:00

标签: java serialization ejb

远程EJB是否可以在没有包含与Map中存储的对象关联的类文件的jar文件的情况下反序列化Map对象?

假设我们创建了以下Java类:

import java.io.Serializable;

public class MyCustomObject implements Serializable
{
    private static final long serialVersionUID = -3100182702835154967L;

    private String myString;
    private int myInt;

    public String getMyString()
    {
        return myString;
    }

    public void setMyString(String myString) 
    {
        this.myString = myString;
    }

    public int getMyInt()
    {
        return myInt;
    }

    public void setMyInt(int myInt)
    {
        this.myInt = myInt;
    }
}

我们在Map中放置此类的实例:

Map<String, Object> mapOfObjects = new HashMap<String, Object>();       
MyCustomObject customObject = new MyCustomObject();
customObject.setMyInt(3);
customObject.setMyString("Hello");
mapOfObjects.put("MyCustomObjectKey", customObject);

如果我现在将此Map对象传递给远程EJB,假设远程EJB没有对MyCustomObject类的引用,那么在反序列化过程中是否会抛出异常?

据我所知,如果我想从Map中检索自定义对象,我必须引用MyCustomObject类

public class RemoteEJB()
{
    public void remoteMethod(Map<String,Object> mapOfObjects)
    {
        MyCustomObject customObject =  (MyCustomObject)mapOfObjects.get("MyCustomObjectKey"); //java.lang.NoClassDefFoundError - Won't compile
    }
}

问题是:假设我不想将对象拉出Map,是否会在远程EJB上进行remoteMethod调用或抛出异常?

1 个答案:

答案 0 :(得分:0)

是的,因为HashMap的反序列化将立即要求反序列化辅助对象,这将失败。如果需要支持这个用例,可以编写一个执行内部序列化步骤的自定义Map(即writeObject创建一个新的ObjectOutputStream来编写内部对象),然后执行按需反序列化(即get ()创建一个新的ObjectInputStream来读取内部对象。)