1、JavaJava高级程序设计高级程序设计第第5 5章章 JavaJava序列化机制序列化机制5.1 应用场景5.2 相关知识5.3 实施过程5.4 拓展知识5.5 拓展训练5.6 课后小结5.7 课后习题5.8 上机实训5.1 应用场景在分布式环境下,当进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传输。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者
2、保存到文件、数据库等系统中,并在需要时把该流读取出来重新构造一个相同的对象。5.2 相关知识5.2.1 序列化的概念5.2.2 序列化应用5.2.3 序列化的几种方式5.2.4 对象实现机制5.2.1 序列化的概念将在内存中的各种对象的状态(也就是实例变量,不是方法)保存在磁盘中或者在网络中进行传输,并且可以把保存的对象状态再读出来。将一个Java对象写入IO流;与此对应的,则是从IO流中恢复一个Java对象。Java提供这种保存对象状态的机制,就是序列化。对象序列化是Java编程中的必备武器5.2.2 序列化应用n当你想把内存中的对象状态保存到一个文件中或者数据库中时候;n当你想用套接字在网
3、络上传送对象的时候;n当你想通过RMI传输对象的时候。5.2.3 序列化的几种方式n在Java中socket传输数据时,数据类型往往比较难选择。可能要考虑带宽、跨语言、版本的兼容等问题。比较常见的做法有两种:n一是把对象包装成JSON字符串传输,n二是采用Java对象的序列化和反序列化。n随着Google工具protoBuf的开源,protobuf也是个不错的选择。n*提示:对JSON,Object Serialize,ProtoBuf 做个对比。5.2.4 对象实现机制n为了方便开发人员将Java对象进行序列化及反序列化,Java提供了一套方便的API来支持。其中包括以下接口和类:njava
4、.io.Serializablenjava.io.ExternalizablenObjectOutputnObjectInputnObjectOutputStreamnObjectInputStream5.2 相关知识5.2.1 序列化的概念5.2.2 序列化应用5.2.3 序列化的几种方式5.2.4 对象实现机制5.3 实施过程5.3.1 任务一 使用serializable序列化实体对象5.3.2 任务二 反序列化将Person对象从磁盘上读出5.3.1 任务一 使用serializable序列化实体对象实现Serializable接口非常简单,只要让Jjava实现Serializable
5、接口即可,无需实现任何方法。一个类一旦实现了Serializable接口,那么该类的对象就是可序列化的。实现类的对象的序列化可以使用ObjectOutputStream,实现步骤如下:创建ObjectOutputStream对象;调用ObjectOutputStream的writeObject方法输出对象。5.3.2 任务二 反序列化将Person对象从磁盘上读出任务需求:反序列化将Employee对象从磁盘上读出并修改员工信息,然后再写入到文件中。分析:相应的反序列化需要使用的类是ObjectInputStream,反序列化步骤如下:创建ObjectInputStream对象;使用Objec
6、tInputStream的readObject方法取出对象。5.5 拓展训练n常见Java序列化方式包括Java原生以流的方法进行的序列化、Json序列化、FastJson序列化、Protobuff序列化。n这里主要讲解JSON序列化。nJson(JavaScript Object Notation,JavaScript对象表示方法),它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成。nJson的表现形式:nJson的表现形式一般就三种(对象,数组,字符串),使用过程中,只是将对象与数组进行混合了任务:利用jackson进行json解析和序列化5.6
7、课后小结对序列化的理解通过序列化和反序列化实现了对象状态的保存、传输以及对象的重建。在进行对象序列化时,开发人员可以根据自身情况,灵活选择默认方式或者自定义方式实现对象的序列化和反序列化。序列化机制是Java中对轻量级持久化的支持。序列化的字节流数据在网上传输的安全问题需要引起大家足够的注意。序列化破坏了原有类的数据的”安全性“,例如private属性是不起作用的。序列化带来的问题网络传输的安全性对象进行序列化之后转化成有序的字节流在网络上进行传输,如果通过默认的序列化方式,则代码都是以明文的方式进行传输。这种情况下,部分字段的安全性是不能保障的,特别是像密码这样的安全敏感的信息。因此,如果您
8、需要对部分字段信息进行特 殊的处理,那么应当选择定制对象的序列化方式,例如对密码等敏感信息进行加密处理。类自身封装的安全性对对象进行序列化时,类中所定义的被private、final等 访问控制符所修饰的字段是直接忽略这些访问控制符而直接进行序列化的,因此,原本在本地定义的想要一次控制字段的访问权限的工作都是不起作用的。对于序列化后的有序字节流来说一切都是可见的,而且是可重建的。这在一定程度上削弱了字段的安全性。因此,如果您需要特别处理这些信息,您可以选择相应的方式对这 些属性进行加密或者其他可行的处理,以尽量保持数据的安全性。所以并非所有的对象都可以序列化。有很多原因,比如:1.安全方面的原
9、因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。2.资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。序列化注意事项关于对象的序列化,总结下注意事项:对象的类名、Field(包括基本类型、数组及对其他对象的引用)都会被序列化,对象的static Field,transient Field及方法不会被序列化;实现Serializable接口的类,如不想某个F
10、ield被序列化,可以使用transient关键字进行修饰;保证序列化对象的引用类型Filed的类也是可序列化的,如不可序列化,可以使用transient关键字进行修饰,否则会序列化失败;反序列化时必须要有序列化对象的类的class文件;当通过文件网络读取序列化对象的时候,必需按写入的顺序来读取5.7 课后习题三、简答题1.什么是Java序列化,如何实现Java序列化?2.在什么情况下需要序列化?3.Java中实现序列化有哪几种方法?5.8 上机实训实训一、序列化的使用1.编写一个可以序列号的个人账户类AccountRecordSerializable 具有如下的成员变量:privateint
11、 account;private String firstName;private String lastName;private double balance;具有如下的成员方法:AccountRecordSerializable(int acct,String first,String last,double bal)/初始化 int getAccount()double getBalance()String getFirstName()String getLastName()void setAccount(int acct)void setBalance(double bal)void
12、setFirstName(String first)void setLastName(String last)2.编写一个类CreateSequentialFile将上述的AccountRecordSerializable对象写入到顺序文件中。成员方法 void openFile()/使用Fileoutputstream和Objectoutputstream创建和打开磁盘文件clients.ser void addRecords()/用户通过键盘依次输入account firstnamelasname balance构建AccountRecordSerializable类对象,然后序列化到文件中。可以输入多行信息。用户按下ctrl+Z结束输入。void closeFile()/关闭磁盘文件对象 3.编写测试类TestCreateSequentialFile main方法中创建CreateSequentialFile类对象,然后调用openFile()addRecords()closeFile()方法。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。