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;
}
}

  

结果:

最新文章

  1. jquery插件——检测DOM元素是否在浏览器可视范围之内
  2. Nancy总结(二)记一次Nancy 框架中遇到的坑
  3. PHP超全局变量
  4. 转-Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
  5. maven编译项目理解
  6. mysqldump使用方法(MySQL数据库的备份与恢复)
  7. 《Java中方法的参数传递方式只有一种:值传递》
  8. [置顶] IOS 基础入门教程
  9. String()与toString()区别和应用
  10. 省去路由器,Windows 7 也能做无线AP
  11. 怎么样linux下的目录名的目录,系统用来操作空间
  12. ssh的public key的使用
  13. SQL函数和SQL Server2008
  14. Unity3D-游戏中的技能碰撞检测
  15. SSH深度历险(四) Maven初步学习
  16. laravel----------carbon时间类的使用介绍
  17. 《Coderxiaoban团队》第二次作业:团队项目选题报告
  18. 04.Python网络爬虫之requests模块(1)
  19. PC上图标显示异常 白色框框处理方案
  20. HTML5学习笔记(十八):闭包

热门文章

  1. 003-转载-keil-STM32硬件错误HardFault_Handler的处理方法
  2. learning svn diff --summarize
  3. zabbix显示 get value from agent failed:cannot connetct to xxxx:10050:[4] interrupted system call
  4. P3746 【[六省联考2017]组合数问题】
  5. 打印出js对象里面的内容
  6. GIT 使用记录,新手->会用(mac 用户)
  7. node.js使用cluster实现多进程
  8. Intellij idea 告警:URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
  9. git远程版本回退
  10. python问题集