Java网络程序设计 第7章

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【例7-3】 使用Java 定义存储消息的类。
1. class Message{
2.
String sender;
3.
String receiver;
4.
String content;
来自百度文库
5.
public Message(String sender,String receiver, String content){
fwrite(&msg[i], sizeof(Struct Message), 1, fp); //读取的方法 for(i=0;i<20;i++)
fread(&msg[i], sizeof(Struct Message), 1, fp);
Java语言中,取消了结构体,除了基本数据类型都是对 象。如果要存储一组相关的数据,就必须采用自定义相关类。
6.
this.sender = sender;
7.
this.receiver = receiver;
8.
this.content = content;
9.
}
10. }
对比两种语言对聊天消息的描述方法,其主要区别在于, 使用Java语言描述方式不仅包含成员变量,而且包括了成员 方法,从而实现了信息的封装。
通常,实现Serializable接口的类所声明的对象实例中所 有字段都会被序列化,这意味着数据会被表示为实例的序列 化数据。这样能够解释该格式的代码有可能能够确定这些数 据的值,而不依赖于该成员的可访问性。类似地,反序列化 从序列化的表示形式中提取数据,并直接设置对象状态,这 也与可访问性规则无关。
序列化是这个过程的第一部分,将数据分解成字节流, 以便 存储在文件中或在网络上传输。反序列化就是打开字 节流,按照被恢复数据的对象实例重构对象。这两个过程结 合起来,就可以轻松地存储和传输对象数据。
序列化的目的: ● 以某种存储形式使自定义对象持久化; ● 将对象从一个地方传递到另一个地方; ● 使程序更具维护性。 Java序列化是基于TCP协议的,实现比较简单,通常不 需要编写保存和恢复对象状态的定制代码。但是要求被序列 化的类是实现了java.io.Serializable接口的,这样就可以转换 成字节流或从字节流恢复,不需要在类中增加额外任何代码。 Serializable接口定义如图7-1所示。
序列化使其他代码可以查看或修改那些不序列化便无法 访问的对象实例数据。确切地说,代码执行序列化需要特殊 的权限,即指定了SerializationFormatter标志的 Security Permission。在默认策略下,通过Internet下载的代 码或Intranet代码不会授予该权限;只有本地计算机上的代 码才被授予该权限。
7.1.3 ObjectInputStream与ObjectOutputStream 为了将存储于对象中的数据保存在磁盘文件或通过网络
序列化在网络程序设计(如Socket、RMI(Remote Method Invocation)、JMS(Java Message Service)、EJB(Enterprise Java Bean))中有广泛的应用。
7.1.2 序列化的实现 对象序列化是将携带信息的对象转换为可以用于存储或
传输形式的过程。在序列化期间,对象将其当前状态写入到 临时或持久性存储区,然后,可以通过从存储区中读取或反 序列化对象的状态,重新创建该对象。序列化分为两大部分: 序列化和反序列化,即对象序列化不仅要将对象转换成字节 表示,有时还要恢复对象。
序列化是一种用来处理对象流的机制,对象流是将对象的 内容进行流化,然后将经过流化后的对象进行读/写操作和用 于网络传输。发送端将对象序列化为流,接收端反序列化从数 据流重新构造对象,保证了对象的完整性和可传递性。即,序 列化的过程是将对象写入字节流,反序列化的过程是从字节流 中读取对象。将对象状态转换成字节流之后,可以用java.io包 中的各种字节流类将其保存到文件中,或者通过管道在线程之 间传输,或者通过网络连接将对象数据发送到另一主机。
图7-1 Serializable接口定义
在Serinalizable接口中未提供任何方法,即不存在需要 被覆盖的方法。通过implements实现Serializable接口的目的 在于标识该对象是可被序列化的。
在Java语言中并不是任何个类都可被序列化。通常将用 于存储信息的类进行序列化,因为这些类所定义的对象是用 于存储和传输的,例如学生信息类、消息信息类。而用于执 行指令和操作的类是不用于序列化的,例如将学生信息储存 和读取类、消息的发送和接收类。尤其要注意,涉及线程的 类和与特定JVM有非常复杂关系的类,都不能进行序列化操 作。
第7章 对象序列化
7.1 对象序列化 7.2 序列化操作 7.3 定制序列化
7.1 对 象 序 列 化
7.1.1 序列化的概念 计算机软件的主要工作是处理数据。在处理数据时,经
常会遇到需要处理一组相关的数据,例如,要保存这样一条 聊天信息“张三:李四:你好”,这条信息中包括三个内容, 即发信者、接收者和聊天内容,通常需要使用三个变量进行 存储。在C语言中使用结构体实现储存一组相关的数据,如 例7-1所示。
在Java语言中,处理数据均采用流的方式,其最大的特 点就是数据的输入和输出都按顺序进行。Java语言是面向对 象的语言,除了字符串对象可以通过writeUTF()和readUTF() 直接操作外,其他对象不能直接存储和通过网络发送。当需 要对使用例7-3的类所定义的实例对象进行存储或者发送时, 就应该将该对象进行序列化操作,使其转变为流形式,然后 才能实现存储和通过网络发送。
【例7-1】 使用结构体存储数据。
Struct Message{ char sender[10]; char receiver[10]; char content[30];
}msg[20];
【例7-2】 利用结构体存储一组数据,并保存在文件中或者从文件 中读取。
File fp =File(); //存储的方法 for(i=0;i<20;i++)
相关文档
最新文档