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. ...
随机推荐
- 2019-8-26 LinkedHashMap 转 List [java.util.LinkedHashMap cannot be cast to com.zq.dataservice.bean.Index]
java.util.LinkedHashMap cannot be cast to com.zq.dataservice.bean.Index 上述错误是在做一个趋势投资demo时遇到的. 说的是链式 ...
- If...else 条件判断和If else嵌套
If(条件表达式){ 如果条件表达式结果为true,执行该处代码. 如果条件表达式结果为false,执行下边代码. }else{ 如果条件表达式结果为false,执行该处代码. } If(条件表达式) ...
- Linux 系统管理——磁盘管理及文件系统实例
1.为主机新增两块30GB的SCSI硬盘 2.划分3个主分区,各5GB,剩余空间作为扩展分区 3.在扩展分区中建立2个逻辑分区,容量分别为2GB.10GB 4.将第一个逻辑分区的类型改为swap 5. ...
- 【loj3119】【CTS2019】随机立方体
题目 一个 $ n m l $ 的立方体等概率填入 $ 1-nml $ ; 定义一个位置是极大的当且仅当这个位置比三位坐标的至少一维与之相等的位置的值都大. 询问极大值恰好有\(k\)个的 ...
- 咕泡学院java架构vip课程
1.wps文档地址 https://docs.qq.com/doc/DRVNLUndvTmFSdEhO 2.百度网盘地址 https://pan.baidu.com/s/1uxaTzJZHKrsw_H ...
- hbase 监控指标项
名词解释 JMX:Java Management Extensions,用于用于Java程序扩展监控和管理项 GC:Garbage Collection,垃圾收集,垃圾回收机制 指标项来源 主机名 u ...
- mysql 存储过程 REPEAT ... UNTIL ... END REPEAT
begin declare b int; declare use_no varchar(10); declare use_name varchar(400); decla ...
- 【大数据】分布式并行计算MapReduce
作业来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319 1. 用自己的话阐明Hadoop平台上HDFS和MapReduc ...
- Netty集成Protobuf
一.创建Personproto.proto 创建Personproto.proto文件 syntax = "proto2"; package com.example.protobu ...
- java图片处理(加水印、生成缩略图)等之Thumbnailator库
Thumbnailator 是一个为Java界面更流畅的缩略图生成库.从API提供现有的图像文件和图像对象的缩略图中简化了缩略过程,两三行代码就能够从现有图片生成缩略图,且允许微调缩略图生成,同时保持 ...