一、基本介绍
1、序列化:
把内存中的Java对象转换成与平台无关的二进制字节序列(在保存数据时,保存数据的值和数据类型)。
2、反序列化:
把字节序列恢复为Java对象(在恢复数据时,恢复数据的值和类型)。
3、对象支持序列化机制则该类必须实现Serialiazble接口
需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现Serialiazble接口(接口内无具体方法,只要声明实现该接口)。
注意:
在Java中为了解决基本数据类型不面向对象的问题,设计了与基本数据类型对应的包装类(Wrapper Class)。包装类使基本数据类型具有对象的性质,且其都实现了Serialiazble接口。
public class A {
public static void main(String[] args) throws Exception{
String filePath = "d:\\ttt.txt";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
oos.writeInt(100);//int->Integer
oos.writeBoolean(true);//boolean->Boolean
oos.writeChar('a');//char->Character
o oos.writeDouble(9.5);//double->Double
oos.writeUTF("我爱学习"); //String
System.out.println("数据保存完毕(序列化形式)");
}
}
4、实现Serialiazble接口的类最好显示声明版本号:private static final serialVersionUID。
凡是实现Serialiazble接口的类都有一个表示序列化版本标识符的静态常量serialVersionUID,用来表示不同版本间的兼容性
5、对象流-ObjectInputStream和ObjectOutputStream
可以将以对象方式存在于内存中的数据存储至文件,需要时再将其从文件中读出还原为对象。
(1)功能:提供了对基本数据类型或对象类型的序列化和反序列化方法
(2)ObjectOutputStream提供了序列化功能。
将内存中的对象通过ObjectOutputStream转换成二进制流,储存在硬盘文件中。
其常用的构造方法:
(3)ObjectInputStream提供了反序列化功能
将硬盘中的文件通过ObjectInputStream转换成相应的对象
其常用的构造方法:
二、序列化示例
通过ObjectOutputStream类对象的writeObject()方法,将指定的对象进行序列化,把得到的字节序列写到目标输出流中
public class Dog implements Serializable {
public static final long serialVersion =1L;
private String name;
private int age;
public Dog(){}
public Dog(String name,int age){
this.name=name;
this.age=age;
}
public int getAge() {return age;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public void setAge(int age) {this.age = age;}
public String toString(){return "Dog [name="+name+",age="+age+"]";}
}
public class A{
public static void main(String[]args){
String FilePath="d:\\b.txt";
ObjectOutputStream ob1=null;
try {
ob1=new ObjectOutputStream(new FileOutputStream(FilePath));
Dog g1=new Dog("旺财",4);
Dog g2=new Dog("来福",3);
ob1.writeObject(g1);
ob1.flush();
ob1.writeObject(g2);
ob1.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (ob1!=null) {
ob1.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三、反序列化示例
通过ObjectInputStream类对象的readObject()方法从源输入流中读取字节序列,再反序列化为对象,并将其返回。
public class B{
public static void main(String[]args){
ObjectInputStream ob2=null;
String FilePath="d:\\b.txt";
try {
ob2=new ObjectInputStream(new FileInputStream(FilePath));
Dog g1=(Dog) ob2.readObject();
System.out.println(g1);
Dog g2=(Dog) ob2.readObject();
System.out.println(g2);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ob2!=null){
ob2.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果: