如何在Java中实现编组类?

时间:2012-03-17 06:19:10

标签: java marshalling rmi

我需要在Java中实现一个Marshalling类。基本上我理解编组用于格式化数据,以便它可以通过套接字网络发送,然后在服务器端解组它。如果我错了,请纠正我。

然后这2个方法来完成。

public void marshallObject (Object obj, ObjectOutputStream stream); 
public Object unmarshallObject (ObjectInputStream stream); 

public void marshallObject(Object obj, ObjectOutputStream stream) {
    try {
        stream.writeObject(obj);
        stream.close();
    } catch (IOException e) {
        System.out.println("Exception:" + e); 
    }
}

public Object unmarshallObject(ObjectInputStream stream) {      
                Object object = null;
    try {
        object = stream.readObject();
    } catch (Exception e) {
        System.out.println("Exception:" + e);       }
    return obj;
}

我正在使用Java对象序列化机制。但是,在这种简单方法中使用这些方法是行不通的,因为Java序列化不会正确地序列化远程引用。我的讲师提到我需要将包含远程引用的存根传递给对象。在这种情况下,远程对象将是服务器。您通过引用而不是通过复制传递远程对象的真正测试是程序需要能够传递服务器并且仍然指向同一对象。我很模糊,任何人都可以向我解释并指导我该怎么做?

2 个答案:

答案 0 :(得分:1)

您的讲师很可能希望您找到并使用编组对象。它们是RMI API的一部分,允许您序列化对象,同时保留其中包含的远程引用。

使用编组对象,您的代码看起来更像是这样:

public void marshallObject(Object obj, ObjectOutputStream stream) {
    try {
        stream.writeObject(new MarshalledObject<Object>(obj));
        stream.close();
    } catch (IOException e) {
        System.out.println("Exception:" + e); 
    }
}

public Object unmarshallObject(ObjectInputStream stream) {      
    MarshalledObject<Object> object = null;
    try {
        object = stream.readObject();
    } catch (Exception e) {
        System.out.println("Exception:" + e);
    }
    return (object != null) ? object.get() : null;
}

有关详细信息,请参阅Javadoc

答案 1 :(得分:0)

你的讲师错了。导出的远程对象由RMI自动编组为其存根。你没有必要在这里做。