《Java网络程序设计》课件_第7章.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

代码注释如下:

①第9行通过TCP连接指定的服务器localhost的8080端口;

②第10行套接字上获得输出流,使其作为对象输出流的参数;

③第11行准备要传输的对象;

④第12~13行通过writeObject()发送信息对象。

【例7-10】实现服务器端,用于接收对象流,进行反序列化操作。代码注释如下:

①第10行启动本地的TCP8080端口,监听客户端的连接请求;

②第12行与客户端实现连接;

③第13行获得套接字的getInputStream(),使其作为ObjectInputStream的参数;

④第15行获得对象,并进行反序列化操作,还原为Message对象;

⑤第16~17行输出结果。

服务器端接收序列化及反序列化操作运行结果如图7-4所示。图7-4服务器端运行结果从运行结果可见,服务器收到的信息对象直接输出是不可读的,除非该信息类中覆盖了Object中的toString()方法。7.3定?制?序?列?化

7.3.1序列化成员变量

在Java中类的成员变量可以是简单数据类型,也可以是复杂数据类型,如字符串类类型、自定义类类型等。当某个类实现了序列化接口时,其未加transient和static修饰的成员变量一同被序列化。所以,当使用类类型定义成员变量时,要保证这些类是可以被序列化的,即实现了Serializable接口。如String类的定义中就声明实现了Serializable接口,如图7-5所示。图7-5String类的定义当实现序列化的自定义类的成员变量中还包含了其他的自定义类对象时,就需要该成员变量实现序列化接口。代码注释如下:

①第6行使用Detail类对象作为成员变量;

②第20~27行实现Detail类的定义,此时它未实现Serializable接口。

可以从以上代码可以看出,新定义了Details类,用于存储消息内容和发送时间,但是该类未实现序列化接口。在Message类中,采用Details类定义了一个details对象。在对此类进行编译时,未出现任何错误提示。在运行对象流发送端时将会抛出异常,提示Details类未实现Serializable接口,如图7-6所示。可见一个实现序列化接口中的成员变量如果是类对象,那么该类也必须实现了序列化接口,否则在运行时就会出现无法实现序列化操作的异常提示信息。图7-6异常提示信息7.3.2定制序列化

对于一个正在运行的类对象来说,存在以下概念:

●?生命周期:从JVM提供一个对象所需要的资源,到释放该对象资源为止,就是一个对象的生命周期。

●?短暂存储:对象在内存中构建后,会随着程序的运行和结束而改变和结束,这就是短暂存储。在Java语言中,序列化过程中,使用transient关键字表示属性或对象是短暂的。

●?永久存储:对象被保存在永久设备中,这些永久设备包括文件、磁盘、数据库等,该对象数据不会随程序结束而消失。对象序列化是对象永久化的一种机制。序列化通常可以自动完成,但有时可能要对这个过程进行控制。对于任何可能包含重要的安全性数据的对象,应该使该对象不可序列化。如果它必须为可序列化的,也需要指定特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。

Java在对类实现serializable接口时,可通过关键字static或transient为类中的数据成员变量进行定制,以实现保护特殊数据的目的。

将数据成员声明为transient后,序列化过程就无法将其加进对象字节流中,也就没有从transient数据成员发送的数据。后面数据反序列化时,要重建数据成员(因为它是类定义的一部分),但不包含任何数据,因为这个数据成员不向流中写入任何数据。在本例的基础上运行例7-7结果如图7-7所示。图7-7保存结果运行例7-8,结果如图7-8所示。图7-8读取结果通过与图7-2和图7-3对比可以发现区别,在消息内容字段无法保存实际的数值,所以在显示时表示为null,如果该字段为数值类型,则表示为0。

【例7-14】修改用于存储消息的类(见例7-3),为消息内容添加transient的修饰。

publicclassMessageimplementsSerialables{

Stringsender;

Stringreceiver;

transientStringcont

文档评论(0)

酱酱 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档