我试图通过物理网络(不是通过localhost)在java中发送一个对象,但似乎我有些不对劲。
对象的接口(客户端和服务器具有此接口):
public interface distributable extends Serializable {
public void test();
}
我想发送的对象(只有服务器有这个):
class ObjectToSend implements distributable {
public ObjectToSend() {
}
public void test() {
system.out.println("worked!");
}
}
服务器:
private ObjectToSend obj = new ObjectToSend();
obj_out_stream.writeObject(obj);
obj_out_stream.flush();
客户端:
private distributable ReceivedObj = null;
try {
ReceivedObj = (distributable) obj_in_steam,readObject();
} catch (ClassNotFoundException e) {
System.err.println("Error<w_console>: Couldn't recieve application code!");
}
ReceivedObj.test();
当ObjectToSend
类实现了Serializable并且我没有使用接口时,一切正常,因为我的所有类都在一个目录中,因此客户端“知道”了该对象。现在我希望它在物理网络中工作,因此客户端只有对象的接口。似乎客户端无法接收对象,因为每次抛出异常。
答案 0 :(得分:2)
应该是这样的。对于那些你没有代码的班级,你能做些什么?
看看这里:stackoverflow.com/questions/8175052/java-polymorphism-my-teacher-claims-you-can-distribute-an-executable-object-thr
答案 1 :(得分:2)
为了能够使用objectinput / outputstream序列化和反序列化对象,类必须实现Serializable。
此外,反序列化器必须能够在类路径中找到您尝试反序列化的类,因为它嵌入在序列化表单中。
答案 2 :(得分:2)
如果您希望客户端只有接口 - 在编译时 - 那么您需要在运行时从服务器下载实际的类。
Jini(又名Apache River)让这很容易。
答案 3 :(得分:2)
正如其他答案所示,客户端还必须知道要发送的对象的类。
通常,为这样一个经典的客户端 - 服务器示例创建三个包/项目:
Common:客户端和服务器使用的代码;要从服务器发送到客户端的对象的类定义属于
客户:只有客户需要了解的所有代码
服务器:只有服务器需要了解的所有代码