对象序列化 数据可以封装成对象,对象运行时是在堆内存中的,如果对象的数据需要存储在硬盘上,那么就要用到对象的序列化流。对象序列化(也叫对象的可串行性)其实就是对象持久化,把内存中的对象,变成硬盘上的文件内容。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
复制代码 |