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;
}
}
结果:

16 IO流(十三)——Object流 序列化与反序列化的更多相关文章
- 第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 ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- Java基础IO流(四)序列化与反序列化
对象的序列化与反序列化: 对象的序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 序列化流(ObjectOutInputStream),是过滤流 -------writeObjec ...
- (21)IO流之对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream
当创建对象时,程序运行时它就会存在,但是程序停止时,对象也就消失了.但是如果希望对象在程序不运行的情况下仍能存在并保存其信息,将会非常有用,对象将被重建并且拥有与程序上次运行时拥有的信息相同.可以使用 ...
- Java IO详解(六)------序列化与反序列化(对象流)
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- Java中I/O流之Object流
Java 中的 object 流:直接将 Object 对象写入或读出 1. serializable 接口:序列化,可以被序列化的,若确实需要将某个类的对象写在硬盘上或网络上,想把他们序列化成一个字 ...
- 节点流和处理流(BufferedReader和BufferedWriter,BufferedInputStream和BufferedOutputStream,ObjectlnputStream和objectOutputStream)
一.基本介绍: 1.节点流可以从一个特定的数据源读写数据,如FileReader. FileWriter 如图:字节流是直接对数据源(文件,数组之类存放数据的地方)进行操作 2.处理流(也叫包装流)是 ...
- Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释
遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化c,seria ...
- c# Json 自定义类作为字典键时,序列化和反序列化的处理方法
一般情况下,Newtonsoft.Json.dll 对 Dictionary<int,object>.Dictionary<string,object>等序列化与反序列化都是成 ...
- java中的序列化与反序列化,还包括将多个对象序列化到一个文件中
package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...
随机推荐
- thinkphp 打印sql语句方法
thinkphp 打印数据use think\Db; 引用db 需要查询的sql语句连锁查询 db()->table('business_order')->alias('o')->j ...
- learning scala akka tell pattern(二)
package com.example import akka.actor._ object Tutorial_02_Tell_Pattern extends App { println(" ...
- XA 事务
4.11.3 什么是XA 事务? <数据库程序员面试笔试宝典>第4章数据库基础,本章主要介绍数据库基础部分的面试题,比较适合应届毕业生,也适合由其他岗位转数据库岗位的人员.本节为大家介绍什 ...
- [CSP-S 2019]格雷码
[CSP-S 2019]格雷码 题目大意: 格雷码(Gray Code)是一种特殊的 \(n\) 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻. ...
- C语言-----野指针
问题所在 1.局部指针变量没有被初始化 2.使用已经释放过后的指针 3.指针所指向的变量在指针之前被销毁 4.结构体成员指针未初始化, 没有为结构体指针分配足够的内存 ,内存越界(考虑使用柔性数组)和 ...
- 1、zookeeper入门
一.什么是Zookeeper Zookeeper是Google的Chubby一个开源的实现,是一个开源的,为分布式提供协调服务的Apache项目; 它包含一个简单的原语集,分布式应用程序可以基于它实现 ...
- 复旦高等代数 I(16级)每周一题
每周一题的说明 一.本学期高代I的每周一题面向16级的同学,将定期更新(一般每周的周末公布下一周的题目); 二.欢迎16级的同学通过微信或书面方式提供解答图片或纸质文件给我,优秀的解答可以分享给大家: ...
- LOJ6102「2017 山东二轮集训 Day1」第三题 【min-max容斥,反演】
题目描述:输入一个大小为\(n\)的集合\(S\),求\(\text{lcm}_{k\in S}f_k\),其中\(f_k\)是第$$个Fibonacci数. 数据范围:\(n\le 5\times ...
- Kali linux 2018 安装 Fluxion
本人是在VMware 12下安装 Kali linux 2018.2版本 安装完成后 用命令行运行更新 apt-get update apt-get full-upgrade 更新所有组件. ...
- mysql索引原理及优化(四)
聚簇索引和非聚簇索引 分析了MySQL的索引结构的实现原理,然后我们来看看具体的存储引擎怎么实现索引结构的,MySQL中最常见的两种存储引擎分别是MyISAM和InnoDB,分别实现了非聚簇索引和聚簇 ...