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

  

结果:

16 IO流(十三)——Object流 序列化与反序列化的更多相关文章

  1. 第12讲-Java中的IO操作及对象的序列化与反序列化

    1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1  io操作 1.2.2  对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...

  2. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  3. Java基础IO流(四)序列化与反序列化

    对象的序列化与反序列化: 对象的序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 序列化流(ObjectOutInputStream),是过滤流 -------writeObjec ...

  4. (21)IO流之对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream

    当创建对象时,程序运行时它就会存在,但是程序停止时,对象也就消失了.但是如果希望对象在程序不运行的情况下仍能存在并保存其信息,将会非常有用,对象将被重建并且拥有与程序上次运行时拥有的信息相同.可以使用 ...

  5. Java IO详解(六)------序列化与反序列化(对象流)

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  6. Java中I/O流之Object流

    Java 中的 object 流:直接将 Object 对象写入或读出 1. serializable 接口:序列化,可以被序列化的,若确实需要将某个类的对象写在硬盘上或网络上,想把他们序列化成一个字 ...

  7. 节点流和处理流(BufferedReader和BufferedWriter,BufferedInputStream和BufferedOutputStream,ObjectlnputStream和objectOutputStream)

    一.基本介绍: 1.节点流可以从一个特定的数据源读写数据,如FileReader. FileWriter 如图:字节流是直接对数据源(文件,数组之类存放数据的地方)进行操作 2.处理流(也叫包装流)是 ...

  8. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化c,seria ...

  9. c# Json 自定义类作为字典键时,序列化和反序列化的处理方法

    一般情况下,Newtonsoft.Json.dll 对 Dictionary<int,object>.Dictionary<string,object>等序列化与反序列化都是成 ...

  10. java中的序列化与反序列化,还包括将多个对象序列化到一个文件中

    package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...

随机推荐

  1. 不用VS调试.Net

    将来,任何开发人员都将需要调试应用程序,并且将无法访问Visual Studio,在某些情况下甚至无法访问源代码.例如,在生产web或应用服务器上调试问题时,我真的不想安装Visual Studio并 ...

  2. 缺失值处理(Missing Values)

    什么是缺失值?缺失值指数据集中某些变量的值有缺少的情况,缺失值也被称为NA(not available)值.在pandas里使用浮点值NaN(Not a Number)表示浮点数和非浮点数组中的缺失值 ...

  3. 干货 | 10分钟教你用column generation求解vehicle routing problems

    OUTLINE 前言 VRPTW description column generation Illustration code reference 00 前言 此前向大家介绍了列生成算法的详细过程, ...

  4. 微信小程序轮播组件

    在index.wxml中添加以下代码 <view> <swiper indicator-dots="{{indicatorDots}}" autoplay=&qu ...

  5. 安利一个github上面的一个神级库thefuck,Linux命令敲错了,没关系,自动纠正你的命令

    没错就是这么神奇,名字相当噶性,thefuck.当你命令输入错误不要怕,直接来一句fuck,自动纠正你输入的命令. 在你输入错误的命令的时候,忍俊不禁的想来一句fuck,没错你不仅可以嘴上说,命令里面 ...

  6. 算法练习题---罗马数字转int

    连接:https://leetcode-cn.com/problems/roman-to-integer/submissions/ 题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 ...

  7. [C++] explicit关键字使用方法

    C++中,构造函数可以用作自动类型转换,但是这种转换不一定是程序所需要的,有时会导致错误的类型转换. 下面的代码,在mian函数中,将一个整形赋值为对象类型. #include "iostr ...

  8. springcloud添加自定义的endpoint来实现平滑发布

    在我之前的文章  springcloud如何实现服务的平滑发布 里介绍了基于pause的发布方案. 平滑发布的核心思想就是:所有服务的调用者不再调用该服务了就表示安全的将服务kill掉. 另外actu ...

  9. Eclipse导入工程提示“No projects are found to import”

    如果发现导入工程的时候,出现"No projects are found to import" 的提示,首先查看项目目录中是否有隐藏文件.project,还有目录结构也还要有一个隐 ...

  10. 解决Ubuntu系统“无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系”的有效方法

    ubuntu系统下安装东西,很多时候会出现版本冲突的情况: 有效的解决方法是使用aptitude来帮助降级. 首先安装aptitude 而后使用aptitude来安装前面有冲突的构建,同样也是要使用r ...