版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称: 序列化和反序列化 专业名称:网络工程班 级:学生姓名: 学号(8位): 指导教师: 朱 辉实验日期: 2016年5月19日实验八 序列化和反序列化一本实验目的及要求:1 熟练掌握类的序列化和反序列化作用;2 熟练掌握ObjectInputStream和ObjectPutputStream两个输入输出类;3 熟练掌握Serializable接口,可以自定义序列化类;4 熟练掌握对类进行序列化和反序列化操作;5 熟练掌握transient修饰关键字的作用。6 完成以下各内容程序并按要求改进,截存运行结果图,并提交实验报告。二、基础知识1
2、序列化和反序列化序列化的过程是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机,在RMI、Socket、JMS、EJB都有应用。 反序列化就是打开字节流并重构对象,恢复数据要求有恢复数据的对象实例。 Java序列化和反序列化过程比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Serializable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。不是每个类都可序列化,有些类是不能序列化的,例如涉及线程的类与特定JVM有非常
3、复杂的关系。序列化的原则:l 基本类型都可以和对象一起被序列化l 被transient关键字标识的基本类型不能被存储l 被transient关键字标识的对象不能被存储l 没有被transient关键字标识的对象必须实现java.io.Serializable接口l 当既没有被transient关键字标识,也没有实现java.io.Serializable接口,抛出java.io.NotSeriableException异常3. ObjectInputStream和ObjectOutputStream类在处理经序列化的对象流,java.io包有两个序列化对象的类,分别是:ObjectOutput
4、Stream负责将对象写入字节流,实现序列化过程, 该序列化过程与字节流连接,包括对象类型和版本信息。ObjectOutputStream类扩展DataOutput接口。 在ObjectOutputStream类中writeObject()方法是最重要的方法,用于对象序列化。如果对象包含其他对象的引用,则writeObject()方法递归序列化这些对象。每个ObjectOutputStream维护序列化的对象引用表,防止发送同一对象的多个拷贝。ObjectInputStream从字节流重构对象,实现反序列化过程。反序列化时,JVM用头信息生成对象实例,然后将对象字节流中的数据复制到
5、对象数据成员中。ObjectInputStream扩展DataInput接口。在ObjectInputStream类中readObject()为重要的方法,实现从字节流中反序列化对象。每次调用readObject()方法都返回流中下一个Object。对象字节流并不传输类的字节码,而是包括类名及其签名。 4 transient修饰关键字实际上,Java的serialization提供了一种持久化对象实例的机制。当实现序列化的类中某个成员变量不需要持久化,则采用transient进行修饰。transient是java语言的关键字,它是类成员变量的修饰符,如果用transient声明一个
6、实例变量,当对象被存储时,则该值不会被存储记录。有类似作用的修饰符还有static。例如,类的成员变量Transient int age; /表示该成员变量不能执行持久化操作,即不能存储或传输Static int age; /表示该成员变量可以存储,但不能传输三、基础知识填空1. 在JAVA中需要将对象进行存储或者通过网络传输时,需要对象使用(ObjectInputStream )和(ObjectOutputStream )。2. JAVA的序列化基于(TCP)协议,它是实现自定义对象(Object)的方法。3. 如果要实现对象序列化,则其所属类必须实现(java.io.Serializabl
7、e)接口。4. 在序列化和反序列化过程中,所使用的2个输入与输出类分别是(ObjectInputStream)和(ObjectOutputStream)。其中输出类中主要的方法是(writeObject()),输入类中主要的方法是(readObject())。5. 当类的成员变量被(transient)修饰时,表明该程序变量为短暂存储,不进行序列化操作。有类似作用的修饰符还有(static)。四、程序填空1. 自定义消息类( package ) message; /打包关键字import java.io.*;class Message implements ( Serializable ) /
8、实现序列化接口 String sender; String receiver; String context; public Message(String sender, String receiver, String context) this.sender = sender; this.receiver = receiver; this.context = context; 2. 消息对象序列化package message;import java.io.*;class MessageSave( implements ) Serializable String filename; publ
9、ic MessageSave(String filename) this.filename = filename; void save() Message msg = new Message("李明", "张华", "How do you do!"); try FileOutputStream fos = new FileOutputStream(filename); ObjectOutputStream oos = new ( ObjectOutputStream(fos ); oos.( writeObject )(msg1);
10、/输出对象 oos.flush(); /将存储缓存中数据保存到磁盘中 oos.close(); /关闭流 fos.close(); catch(Exception e) System.err.println(e.toString(); public static void main(String argv) MessageSave ms = new MessageSave("msgDB.dat"); ms.save(); 3. 消息对象反序列化package message;import java.io.*;import ( .* );class exp_7_11 publ
11、ic static void main(String argv) ServerSocket ss = null; Socket s = null; ObjectInputStream ois = null; try ss = new ServerSocket(8080); System.out.println("服务启动本地8080端口"); s = ss.accept(); ois = new ( ObjectInputStream )(s.getInputStream(); System.out.println("与客户端建立连接"+s.toStri
12、ng(); Message obj = (Message)ois.( readObject )(); System.out.println(obj.toString(); /注意该语句输出是什么内容 System.out.println(obj.sender + " :" +obj.receiver + " : " + obj.content); ois.close(); s.close(); catch(Exception e) System.err.println(e.toString(); 五、实验内容1 定义一个可以被序列化的,用于记录学生信息的
13、类(注意与C语言中的结构体对比)。import java.io.*;public class Student implements Serializable String name; char gender; String birthday;public Student(String name,char gender,String birthday) = name; this.gender = gender; this.birthday = birthday; public void show() System.out.println("学生: " +
14、name); System.out.println("姓名: " + name); System.out.println("性别: " + gender); System.out.println("生日: " + birthday); 使用该学生类,用于保存学生信息至指定文件中。import java.io.*;public class StuSavepublic static void main(String argv)throws ExceptionStudent Emily = new Student("E. Jord
15、an", '男', "1901-01-01");Student Jeffy = new Student("E. Jordan", '男', "1901-01-01");FileOutputStream fos = new FileOutputStream("StuDB.dat");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(Emily);oos.writeObject(Jeffy)
16、;oos.flush();oos.close();fos.close(); /尝试保存更多的学生信息至该文件中将学生信息从指定文件中读取出来import java.io.*;public class StuShowpublic static void main(String argv)throws ExceptionFileInputStream fis = new FileInputStream("StuDB.dat");ObjectInputStream ois = new ObjectInputStream(fis);Student Emily = (Student)
17、ois.readObject();Student Jeffy = (Student)ois.readObject();ois.close();fis.close();Emily.show();Jeffy.show(); /注意读取的时候,按照顺序读取报告内容:如果在student.java类中,不实现Serializable,编译后再次运行程序,会出现什么异常。定义一个学生的课程成绩类,并用新定义的类,定义student类中的成员变量,例如:class subjet implements Serializabl String name; float score; public subject(
18、String name, float score) = name; this.score = score; class student implements Serializabl String name;char gender;String birthday;subject sub;。报告内容,完成对学生类的定义,并修改StuSave和StuShow使可以实现数据的保存和读取。2 利用序列化在网络通信中传输对象。/信息类import java.io.*;public class message implements Serializable String sender;
19、String receiver; String action; String context;public message(String sender, String receiver, String action, String context) this.sender = sender; this.receiver = receiver; this.action = action; this.context = context; 该消息由客户端发出,服务器端接收/客户端import java.io.*;import .*;public class IMclientpublic static
20、 void main(String argv)Socket s = null;ObjectOutputStream os = null;trys = new Socket("localhost", 8080);os = new ObjectOutputStream(s.getOutputStream();message obj = new message("LiMing", "ZhangHua", "kick", "Come on");os.writeObject(obj);os.flush()
21、;System.out.println("Message Send Successful");os.close();s.close();catch(Exception e)e.printStackTrace(); /服务器端import java.io.*;import .*;public class IMserver implements Cloneable, Runnable ServerSocket service = null; Socket clientSocket = null; ObjectInputStream ois = null; Thread work
22、er = null;public static void main(String argv)throws IOExceptionIMserver serv = new IMserver();serv.startServer();public synchronized void startServer() throws IOExceptionif(worker = null)service = new ServerSocket(8080);System.out.println("Server Listen on 8080!");worker = new Thread(this
23、);worker.start(); public void run()Socket client = null;if(service != null)while(true)tryclient = service.accept();IMserver newServer = (IMserver)clone(); /注意启动通信线程的方法newServer.service = null;newServer.clientSocket = client;newServer.worker = new Thread(newServer);newServer.worker.start();catch(IOEx
24、ception e)e.printStackTrace();catch(CloneNotSupportedException e)e.printStackTrace();elseperform(clientSocket); private void perform(Socket client)tryois = new ObjectInputStream(clientSocket.getInputStream();message obj = (message)ois.readObject(); System.out.println(obj.toString(); /注意该语句输出是什么内容Sys
25、tem.out.println(obj.sender + " " + obj.action + " " + obj.receiver + " : " + obj.context);catch(Exception e)e.printStackTrace();tryois.close();clientSocket.close();catch(IOException e)e.printStackTrace(); 报告内容:修改客户端和服务端程序,实现循环发送和接受数据。3. 使用transient修饰关键字,对序列化对象中的某些成员属性进行
26、修饰,然后再次运行程序,查看运行结果。例如在源代码1中的student类中,对”gender”使用transientimport java.io.*;public class Student implements Serializable String name; transient char gender; String birthday;public Student(String name,char gender,String birthday) = name; this.gender = gender; this.birthday = birthday;public
27、void show() System.out.println("学生: " + name); System.out.println("姓名: " + name); System.out.println("性别: " + gender); System.out.println("生日: " + birthday); 在源代码2中,对message类中,对”action”使用transientimport java.io.*;public class message implements Serializable St
28、ring sender;String receiver;transient String action;String context;public message(String sender, String receiver, String action, String context)this.sender = sender;this.receiver = receiver;this.action = action;this.context = context; 4检索在计算机网络安全中,数字签名的作用和所使用的相关技术。利用序列化传递签名信息/签名import java.io.*;impo
29、rt java.security.*;public class signedObj implements Serializable byte b; byte sig; PublicKey pub;public signedObj(byte b, byte sig, PublicKey pub)this.b = b;this.sig = sig;this.pub = pub; /客户端package sign;import java.io.*;import .*;import java.security.*;public class clientpublic static void main(S
30、tring argv)Socket s = null;ObjectOutputStream os = null;trys = new Socket("localhost", 8080);os = new ObjectOutputStream(s.getOutputStream();KeyPairGenerator kgen = KeyPairGenerator.getInstance("DSA");kgen.initialize(512);KeyPair kpair = kgen.generateKeyPair();Signature sig = Sig
31、nature.getInstance("SHA/DSA");PublicKey pub = kpair.getPublic();PrivateKey priv = kpair.getPrivate();sig.initSign(priv);FileInputStream fis = new FileInputStream("StuDB.dat");byte arr = new bytefis.available();fis.read(arr);sig.update(arr);signedObj obj = new signedObj(arr, sig.s
32、ign(), pub);os.writeObject(obj);/将签名内容保存在文件中/*FileOutputStream fos = new FileOutputStream("SigDB.dat");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(obj);oos.flush();oos.close();*/os.flush();os.close();fis.close();s.close();catch(Exception e)System.err.println(e.getM
33、essage(); /服务器端package sign;import java.io.*;import .*;import java.security.*;public class server implements Cloneable, Runnable ServerSocket service = null; Socket clientSocket = null; ObjectInputStream ois = null; Thread worker = null; KeyPairGenerator kgen; KeyPair kpair;public static void main(String argv)throws IOExceptionserver serv = new ser
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 避雷模板课件
- 辩论模板课件
- 安徽省省城名校2027届中考物理考试模拟冲刺卷含解析
- 湖南省武冈市第三中学2027届中考物理模试卷含解析
- 2027届山西省大同市矿区重点名校中考物理仿真试卷含解析
- 《机械制图开》课件
- 病理技术经验分享课件
- 《水泥的储存与发运》课件
- 《老年期的心理发展》课件
- 玻璃画小夜灯封面设计课件
- Effective C++ 第三版完整版中文版(Effective C++ 第 3 版)(全文完整译本 + 课后习题解析)
- 2026-2027学年济南天桥区泺口实验学校九年级9月份语文月考考试试题以及答案
- 2026年宁波银行秋招试题及答案
- IEC 60601-1-2-2024 中文版(医用电气设备 第 1-2 部分:基本安全和基本性能的要求 并列标准:电磁兼容 要求和试验)
- 2026年永州职业技术学院高职单招职业技能考试题库完美版附答案详解
- 工业企业温室气体排放核算表
- 2025-2026学年甘肃省兰州市五校联考八年级上册期中考试物理试卷 含答案
- (正式版)DB43∕T 2546-2023 《早期人防工程分类鉴定规范》
- 兽医公共卫生学-全套教学课件
- 2025江南大学辅导员招聘考试真题
- 2026年版《中华人民共和国药品管理法实施条例》学习与解读课件
评论
0/150
提交评论