0

远程 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,remoteMethod 调用会发生在远程 EJB 上还是会引发异常?

4

1 回答 1

0

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

于 2013-01-08T15:30:25.757 回答