黑马程序员技术交流社区

标题: 反序列化时类的加载 [打印本页]

作者: 王亮    时间: 2011-7-20 16:31
标题: 反序列化时类的加载
在远程传递对象时,主机先序列化对象,而客户机反序列化时,先会加载并且初始化对象所属的类(会执行此对象的静态代码块和初始化静态变量),那么这个类来自于哪里,客户端不一定有此类的.class文件啊?是来自与主机吗?
作者: 杨志罡    时间: 2011-7-21 03:20
我认为这样的程序是没法运行的,既然你传输了对象,那么客户端接收时,肯定得有这样的类存在然后用这个类的引用变量去接收,张老师讲到过,双方必须都有约定俗成的语言,就是指双方必须定义相同的类。
[ 本帖最后由 杨志罡 于 2011-07-21  03:21 编辑 ]
作者: 匿名    时间: 2011-7-21 15:39
对不起,可能是我没有表述清楚,但是我确实是说的是序列化和反序列化对象,至于admin所说的“哥们,是对象序列化,不是类序列化,传的是”,可能你理解有偏差。

杨志罡 同学的回答的意思就是说远程的客户端反序列化时,客户端一定要存在此对象的类文件,否则行不通是这样吗?我没法尝试。会尝试的(一台机子能行吗?)

但是,要提醒的是,类文件并不一定要在本地,也可以来自网络,我的理解是,反序列化是加载的类是从主机传来的,当然要尝试。谢谢。
作者: 匿名    时间: 2011-7-23 14:25
上面同学说的对:

我认为这样的程序是没法运行的,既然你传输了对象,那么客户端接收时,肯定得有这样的类存在然后用这个类的引用变量去接收,张老师讲到过,双方必须都有约定俗成的语言,就是指双方必须定义相同的类。

我的理解错误。

使用ftp通信时,核心代码就是:
[code=java]//服务器
ServerSocket serverSocket = new ServerSocket(8000);

Socket socket = serverSocket.accept();


OutputStream oos = socket.getOutputStream();


ObjectOutputStream oos = new ObjectOutputStream(oos);


oos.writeObject(new MyClasss());//MyClasss是自定义的一个类[/code]

[code=java]//客户机
Socket socket = new Socket("loaclhost",8000);
InputStream in = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(in);
Object obj = ois.readObject();[/code]

确实,如果先启动服务器程序,再启动客户端程序(两者都用命令行指定classpath),客户端程序的classpath中无MyClasss的类文件,出现ClassNotException。

所以,“张老师讲到过,双方必须都有约定俗成的语言,就是指双方必须定义相同的类。”确实有道理。要有这个思维啊。
作者: 匿名    时间: 2011-7-23 16:22
…学习了…,最开始没想到这些问题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2