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. HTML之微信全屏播放视频

    不废话,上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  2. es6中class类的静态方法、实例方法、实例属性、(静态属性)

    关于类有两个概念,1,类自身,:2,类的实例对象 总的来说:静态的是指向类自身,而不是指向实例对象,主要是归属不同,这是静态属性的核心. 难点1:静态方法的理解 class Foo { static ...

  3. 设计模式——<面向对象设计原则以及23种设计模式分类>

    一.面向对象八大设计原则: 1.依赖倒置原则(DIP) 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) . 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽 ...

  4. MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法

    MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法 事情的起因     今天课堂上要展示小组项目,需要用一个软件叫W ...

  5. Vue 打包部署到服务器后,非主页刷新后出现404问题解决

    开心把项目部署到服务上,从头到尾点了一遍,发现没有问题,以为就可以大功告成,没想到刷新页面时出现 被破泼了一脸的凉水,更奇怪的事首页没有问题,只有其他页面出现,在调戏了很久的度娘后,才从坑里跳出来,以 ...

  6. 【大数据应用技术】作业十|分布式文件系统HDFS 练习

    本次作业的要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3292 1.目录操作 在HDFS中为hadoop用户创建一个用户目 ...

  7. AOP通知类型

    AOP通知类型 前置通知 在目标方法执行之前进行操作 后置通知 在目标方法执行之后 进行操作 环绕通知 在目标方法执行之前 和之后进行操作 public Object arount() 异常抛出通知 ...

  8. SQL server 表结构转Oracle SQL脚本

    SQL server 表结构转Oracle SQL脚本 /****** Object: StoredProcedure [dbo].[getOracle] Script Date: 2019/7/25 ...

  9. docker nginx安装

    安装nginx镜像docker search nginxdocker pull nginx 启动Nginx容器docker run -it -d --name n1 -v/home/n1/nginx. ...

  10. Uni-app 使用总结

    1.去掉顶部导航 在page.json中添加 "globalStyle" : { "navigationBarTextStyle" : "black& ...