序列化和反序列化
在前面已经说过,基本类型+String数据+类型的保留,这节有点类似,说的是引用数据的数据和类型的保留。它们有另外的名称序列化和反序列化。
——反序列化(将数据结构或对象转换成二进制串的过程,从文件或字节数组中取出对象) 输入流:ObjectInputStream readObject()
——序列化(将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程,把对象保存到文件或字节数组中) 输出流:ObjectOutputStream writeObject()
——注意:
————1)先序列化后反序列化;反序列化顺序必须与序列化一致
————2)不是所有对象都可以序列化,类必须实现java.io.Serializable;不是所有对象的属性都需要序列化,不需要的添加关键字transient
数据结构和对象:对于类似Java这种完全面向对象的语言,工程师所操作的一切都是对象(Object),来自于类的实例化。在Java语言中最接近数据结构的概念,就是POJO(Plain Old Java Object)或者Javabean--那些只有setter/getter方法的类。而在C++这种半面向对象的语言中,数据结构和struct对应,对象和class对应。
package cn.feng.others;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;
public class ObjectDemo01 {
public static void main(String[] args) {
try {
seri("D:/安装包/aa/bb/dd/b.txt");
read("D:/安装包/aa/bb/dd/b.txt");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 序列化
* @throws IOException
* @throws FileNotFoundException
*/
public static void seri(String desPath) throws FileNotFoundException, IOException{
Employee emp = new Employee("张三",100000);
int[] arr = {1,2,3,4,5};
//创建源
File des = new File(desPath);
//选择流ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream(des))
);
//操作 写出的顺序与读取的顺序必须一致 为读取准备
oos.writeObject(emp);
oos.writeObject(arr);
//释放资源
oos.close();
}
/**
* 反序列化
* @throws IOException
* @throws FileNotFoundException
*/
public static void read(String srcPath) throws FileNotFoundException, IOException, ClassNotFoundException{
//创建源
File src = new File(srcPath);
//选择流
ObjectInputStream ois = new ObjectInputStream(
new BufferedInputStream(new FileInputStream(src))
);
//操作 读取的顺序与写出一致且必须存在才能读取
//顺序不一致,数据存在问题
Object obj = ois.readObject();
if(obj instanceof Employee){
Employee emp = (Employee)obj;
System.out.println(emp.getName());//没有序列化的属性,内容:null
System.out.println(emp.getSalary());//内容:100000.0
}
obj = ois.readObject();
int[] arr = (int[])obj;
System.out.println(Arrays.toString(arr));//内容:[1, 2, 3, 4, 5]
//释放资源
ois.close();
}
}