A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 顾玲玉 中级黑马   /  2013-5-31 08:23  /  1254 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 顾玲玉 于 2013-5-31 08:41 编辑

一个类实现了Serializable接口,则表明这个类是可序列化的,那都有哪些类需要实现可序列化?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
对象序列化
数据可以封装成对象,对象运行时是在堆内存中的,如果对象的数据需要存储在硬盘上,那么就要用到对象的序列化流。对象序列化(也叫对象的可串行性)其实就是对象持久化,把内存中的对象,变成硬盘上的文件内容。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。
代码示例借鉴优秀的博客思路,自己敲了一遍,掌握相关知识点
  1. import java.io.FileInputStream;  
  2. import java.io.FileOutputStream;  
  3. import java.io.IOException;  
  4. import java.io.ObjectInputStream;  
  5. import java.io.ObjectOutputStream;  
  6. import java.io.Serializable;  
  7.   
  8. public class ObjectStreamDemo {  
  9.   
  10.     /**
  11.      * @param args
  12.      * @throws Exception  
  13.      */  
  14.     public static void main(String[] args) throws Exception {  
  15.         // TODO Auto-generated method stub  
  16. //      WriteObject();  
  17.         ReadObject();  
  18.     }  
  19.       
  20.     public static void ReadObject() throws  Exception{  
  21.         //通过ObjectInputStream读取序列化后的对象   
  22.         ObjectInputStream ois =   
  23.                 new ObjectInputStream(new FileInputStream("D:\\caoRuiXiang.object"));  
  24.         Person cao = (Person) ois.readObject();  
  25.          
  26.         System.out.println(cao.getInfo());  
  27.     }  
  28.       
  29.     public static void WriteObject() throws IOException{  
  30.         //通过ObjectOutputStream将对象序列化  
  31.         ObjectOutputStream oop =   
  32.                   new ObjectOutputStream(new FileOutputStream("D:\\caoRuiXiang.object"));  
  33.           oop.writeObject(new Person("曹睿翔",23,"hongkang"));//country为静态,不能序列化,所以,写入文件中的不是“HongKang”,而是CN  
  34.           oop.close();  
  35.     }  
  36.   
  37. }  
  38.   
  39. class Person implements Serializable{  
  40.     public static final  long serialVersionUID = 12L;  
  41.     private String name;  
  42.     private int age; //age如果不想序列化,可以在前边加 transient 关键字,保证其值在堆内存中存在而不在文本文件中存在。   
  43.     static String county = "cn";  
  44.     public Person(String aName,int aAge,String cCounty){  
  45.         this.name = aName;  
  46.         this.age = aAge;  
  47.         this.county = cCounty;  
  48.     }  
  49.       
  50.     public String getInfo(){  
  51.         return this.name  +  this.age + county;  
  52.     }  
  53.       
  54. }  
  55. //Serializable serializable Serializable Serializable Serializable Serializable   
  56. //serialVersionUID serialVersionUID serialversionUID  
复制代码

评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2 很给力!

查看全部评分

回复 使用道具 举报
有图有真相 / 无图无真相
回复 使用道具 举报
王安琪 发表于 2013-5-31 09:11
有图有真相 / 无图无真相

可以视为你灌水,上进上进
回复 使用道具 举报
曹睿翔 发表于 2013-5-31 10:06
可以视为你灌水,上进上进

。。。冤枉啊  什么叫灌水啊   唉唉。。。。
回复 使用道具 举报
人生戏,从黑马开始*^_^*
回复 使用道具 举报
如果问题已经解决,再次编辑,修改主题类型为已解决,方便大家查看
否则继续追问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马