16 IO流(十三)——Object流 序列化与反序列化
Object流、序列化与反序列化
Object流是将 可序列化的对象 进行序列化与反序列化的流。
可序列化的对象:使用关键字Serializable修饰,表示这个对象可以进行序列化与反序列化。
序列化:序列化即将对象转换为字节数组进行传输或出错。
反序列化:将含对象的字节数组转为对象。
就如我们的Data流一样,Data流保存的是基础数据类型,Object保存的是引用数据类型。
也与Data流一样,读取写入的顺序要保持一致。
需要注意的细节
Object流与Data流有好几个相似的方法:
反序列化时需要使用instanceOf判断类型是否相同在做转换。
可序列化的类中不需要序列化的数据用 transient修饰,在反序列化后,该数据为null。
private transient String name = "";
反序列化时,读取对象,需要用Object来接收,然后判断接收到的是否为对应的类的对象,如果是再强转。
Object str = ois.readObject();//用Object接收。readObject方法可能会报classNotFound异常,必须处理 if(strObject instanceof String){//判断 String strObjecet = (String)str;//强转为String类型 System.out.println(strObject); }
本节完整代码
import java.io.*; public class ObjectTest { /** *为了演示,先写入流,再从流中读取 *ObjectInputStream与ObjectOutputStream */ public static void main(String[] args){ //输出流 ByteArrayOutputStream baos = new ByteArrayOutputStream (); ObjectOutputStream oos = null; try{ oos = new ObjectOutputStream(baos); //操作:写入基础数据类型 oos.writeUTF("谁言寸草心"); oos.writeFloat(2.2f); //写入引用类型数据 oos.writeObject("我真的是一个好人");//写入String类型 Person p = new Person("马云",1000); oos.writeObject(p); oos.flush();//刷新流 byte[] datas = baos.toByteArray();//提出数据 //输入流 ObjectInputStream ois = new ObjectInputStream( new ByteArrayInputStream(datas)); //操作:读取数据-基础类型 String str = ois.readUTF(); System.out.println(str); float f = ois.readFloat(); System.out.println(f); //读取数据-引用类型 Object str1 = ois.readObject(); Object p1 = ois.readObject(); if(str1 instanceof String){ String strObject = (String)str1;//强转为String类型 System.out.println(strObject); } if(p1 instanceof Person){ Person p2 = (Person)p1; System.out.println("姓名:"+p2.getName()+" 工资:"+p2.getSalary()); } }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } } } class Person implements Serializable //实现Serializable接口 { private transient String name = "";//使用transient修饰的不会被序列化 private int salary = 0; public Person(){ } public Person(String name,int salary){ this.name = name; this.salary = salary; } public String getName(){ return name; } public int getSalary(){ return salary; } }
结果: