Java RMI,使对象可序列化和远程

时间:2011-06-07 16:22:18

标签: java serialization rmi

你可能在想为什么你想要一个Remote和serializeable对象。好吧,让我给你一些背景信息。

我正在建立一个空中交通管制系统(学校项目),它的分布使每个控制区在其自己的服务器上运行并与其他控制区通信。每个控制区都跟踪自己的aiplanes。

当飞机(在控制区A中飞行)在其边界附近100公里处时,它将作为远程对象传递到它靠近的控制区(控制区B)。这样,控制区B可以看到aiplane的位置(通过定期询问其位置),同时它仍然由控制区A控制。

但是当飞机越过控制区A和B之间的边界时,控制区B应该跟踪飞机而不是控制区A.所以我们要将飞机序列化并将其传递给控制区B.这就是我们的问题所在。 。

我可以让飞机远程和可序列化吗?

编辑:另外,我可以使用远程方法复制飞机所需的字段,但我更喜欢将其序列化。

4 个答案:

答案 0 :(得分:3)

如果远程对象在作为远程方法参数或结果发送时未被导出,则它被序列化而不是作为远程引用传递,前提是它实现了Serializable和Remote。然后将其导出到接收器。例如,UnicastRemoteObject执行此操作,因此从它派生的任何远程对象也是如此。这可以用于移动远程代理。

答案 1 :(得分:2)

您不必使对象成为UnicastRemoteObject的子类。

拿你的类,定义它来实现Serializable和你的RMI api接口,它本身应该实现Remote。除了java.lang.Object之外,它不需要子类化。

当您准备远程调用对象时,请在其上调用静态UnicastRemoteObject.exportObject()方法。从那时起,通过RMI返回到该对象的任何引用都可以远程调用。

如果要将对象传递给另一台服务器,请在对象上调用UnicastRemoteObject.unexportObject()。然后,当您通过RMI调用传递它时,您将传递该对象的序列化表示。

这样做的缺点是,一旦你将其关闭,服务器上的对象将不再接受RMI调用。 unexportObject()将其作为RMI呼叫接收者完全关闭。

如果您希望能够将对象维护为RMI目标并同时通过RMI将其作为可序列化对象传递,则需要使其可序列化并插入一个导出Remote接口的代理对象,哪个可以代表调用者与未导出的可序列化对象进行对话。

如果要通过序列化传递基础对象,则直接传递它。如果要将远程可调用引用传递给它,则传递代理。

答案 2 :(得分:1)

看看UnicastRemoteObject课程。它通常用于RMI中的回调驱动编程,因此实现RemoteSerializable。虽然你可能想重新审视你的逻辑,因为你现在有一个实体(飞机)就像一个“远程服务器”。

答案 3 :(得分:0)

原来这个解决方案不正确。请参阅下面的@ EJP答案,了解使用单个实例执行此操作的唯一方法。