我有一个java Web服务器,我做了它,以便服务器通过发回一个包含“执行”方法的java对象来响应某个http *请求。
我希望能够执行远程对象的方法。
我不能使用反射,因为我不发送类,考虑创建一个具有相同方法+ package-name的本地类,所以我可以尝试object.getClass()
我不想将整个代码块放在我要发送的对象的toString()中。 (覆盖)
我无法转换为界面。
我也在考虑创建一个.jar库,它具有将在服务器上创建并在客户端上访问的类文件的定义,这怎么可以工作?
我找不到有关此问题的另一个问题,所以我将把它留在这里。
编辑:
我正在使用URLConnection与servlet通信,servlet在服务器上创建对象的实例然后它将使用ObjectOutputStream将其发送到客户端,以及客户端上的ObjectInputStream以获取它它
寻找RMI的一些替代方案,如果没有,我会查找一些RMI教程。
关于我选择不首先使用RMI:也许我不希望每次都在客户端服务器之间建立连接,也许我想反序列化对象并检查/调用它的方法。 / p>
答案 0 :(得分:2)
如果你要去"发送"从一个java虚拟机(java进程)到另一个java虚拟机的序列化对象,你需要在两端都有.class文件。如果您决定继续使用当前的方法,则需要以下内容:
您的客户端必须是Java,或者能够运行Java,并且具有与本地接收的对象相对应的.class文件,或者必须在访问它们之前从服务器下载它们。
您必须以某种方式在HTTP中包装序列化对象流。 HTTP是用于请求和发送网页的协议。它与Java的序列化协议(例如,它包含额外的头文件)不兼容,您需要将Java序列化包装在HTTP有效负载内,以使事情按预期工作。
发送序列化对象时,实际上是在发送"对象图" (通过导航其字段可访问的对象和所有对象)。这最终可能效率低下。由于这个原因,序列化可能不是最佳答案。
使用其他机制要容易得多:
如果您避免使用HTTP,则可以避免使用额外的包装器。编写一个简单的服务器,当连接到,接收和发送序列化对象时,比在传统Java Web应用程序中编写HTTP包装器(Java应用程序服务器往往需要资源)更容易,更有效。
考虑使用Kryo或其他Java序列化/网络库 - 它们带有内置服务器,并允许对正在发送的内容进行非常细粒度的控制。
Java内置了对RMI的支持("远程方法调用")。这似乎是你实际想要实现的目标。您不再需要知道对象是本地对象还是远程对象 - 它们看起来工作原理相同,所有必需的网络和序列化都是在幕后完成的。阅读all about it。