黑马程序员技术交流社区
标题: 序列化的问题 [打印本页]
作者: 顾玲玉 时间: 2013-5-31 08:23
标题: 序列化的问题
本帖最后由 顾玲玉 于 2013-5-31 08:41 编辑
一个类实现了Serializable接口,则表明这个类是可序列化的,那都有哪些类需要实现可序列化?
作者: 曹睿翔 时间: 2013-5-31 08:47
对象序列化
数据可以封装成对象,对象运行时是在堆内存中的,如果对象的数据需要存储在硬盘上,那么就要用到对象的序列化流。对象序列化(也叫对象的可串行性)其实就是对象持久化,把内存中的对象,变成硬盘上的文件内容。IO中供对象序列化的流对象为ObjectInputStream和ObjectOutputStream。
注意:
1. 用ObjectOutputStream写入的的文件,只能用ObjectInputStream来重构读取。
2. 被序列化的对象必须实现Serializable接口。
3. 对象的静态成员和被transient关键字修饰的成员不能被序列化。(当对象在堆内存的私有对象不希望被序列化时,可以使用transient关键字)。
此外,序列化的文件一般以.ojbect作为类型后缀名,一个文件中可以存放多个不同类型的序列化对象。
Serializable接口
在对对象进行序列化时,必须实行Serializable接口,否则使用ObjectOutputStream写入时,会出现NotSerializableException异常。
Serializable接口并没必须要实现的方法,类定义时仅标示一下实现即可。实现Serializable的类,都有serialVersionUID,如果你没有在类中显式定义一个serialVersionUID,那么编译器会根据该类中的成员生成一个具有唯一性的serialVersionUID。
显式定义serialVersionUID的好处:如果你在对类对象进行了序列化之后,又修改了这个类,那么再次读取修改前序列化的对象时,编译器可以识别;如果没有显式定义,你修改后的类经过编译器编译后会生成一个新的serialVersionUID,这个serialVersionUID跟修改前类的serialVersionUID不同,当你再次读取时,编译器会报出InvalidClassException异常。所以,如果类对象需要序列化,建议显式定义serialVersionUID。
代码示例借鉴优秀的博客思路,自己敲了一遍,掌握相关知识点- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
-
- public class ObjectStreamDemo {
-
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- // WriteObject();
- ReadObject();
- }
-
- public static void ReadObject() throws Exception{
- //通过ObjectInputStream读取序列化后的对象
- ObjectInputStream ois =
- new ObjectInputStream(new FileInputStream("D:\\caoRuiXiang.object"));
- Person cao = (Person) ois.readObject();
-
- System.out.println(cao.getInfo());
- }
-
- public static void WriteObject() throws IOException{
- //通过ObjectOutputStream将对象序列化
- ObjectOutputStream oop =
- new ObjectOutputStream(new FileOutputStream("D:\\caoRuiXiang.object"));
- oop.writeObject(new Person("曹睿翔",23,"hongkang"));//country为静态,不能序列化,所以,写入文件中的不是“HongKang”,而是CN
- oop.close();
- }
-
- }
-
- class Person implements Serializable{
- public static final long serialVersionUID = 12L;
- private String name;
- private int age; //age如果不想序列化,可以在前边加 transient 关键字,保证其值在堆内存中存在而不在文本文件中存在。
- static String county = "cn";
- public Person(String aName,int aAge,String cCounty){
- this.name = aName;
- this.age = aAge;
- this.county = cCounty;
- }
-
- public String getInfo(){
- return this.name + this.age + county;
- }
-
- }
- //Serializable serializable Serializable Serializable Serializable Serializable
- //serialVersionUID serialVersionUID serialversionUID
复制代码
作者: 王安琪 时间: 2013-5-31 09:11
有图有真相 / 无图无真相
作者: 曹睿翔 时间: 2013-5-31 10:06
王安琪 发表于 2013-5-31 09:11 ![](static/image/common/back.gif)
有图有真相 / 无图无真相
可以视为你灌水,上进上进
作者: 王安琪 时间: 2013-5-31 10:09
曹睿翔 发表于 2013-5-31 10:06 ![](static/image/common/back.gif)
可以视为你灌水,上进上进
。。。冤枉啊 什么叫灌水啊 唉唉。。。。
作者: 王安琪 时间: 2013-5-31 10:18
人生戏,从黑马开始*^_^*
作者: 曹睿翔 时间: 2013-6-2 10:31
如果问题已经解决,再次编辑,修改主题类型为已解决,方便大家查看
否则继续追问
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |