Java IO---序列化和反序列化
一.序列化和反序列化介绍
什么是序列化和反序列化?
序列化就是将对象转换为字节序列的过程。
反序列化就是将字节序列恢复为对象的过程。
序列化的用途在哪?
通常情况下,序列化有两个用途:
- 将对象的字节序列永久的保存到硬盘上,一般存在一个文件中。
- 在网络中传送对象的字节序列。
序列化的意义?
序列化机制使得对象可以脱离程序的运行而独立存在,能够离开内存空间,以便能长期保存。
比如:一个记录用户信息设置的类,当程序退出后下次再运行要保留上次的信息设置,此时就可以把这个类作为配置文件存在磁盘上,每次运行时再读取。
二.序列化和反序列化要点
序列化接口(Serializable)
要序列化的对象必须实现Serializable接口,否则将出现异常NotSerializableException,无法序列化
transient关键字
注意并不是所有的元素都需要序列化,当某些元素不需要序列化时,可以使用transient关键字修饰,被transient修饰的元素,不会进行jvm默认的序列化。
jvm是否允许反序列化,不仅与类的路径和功能代码是否一致相关,更重要的是类的序列化ID是否一致,也就是
private static final long serialVersionUID序列化ID有两种生成策略:一种是固定的1L,一种是随机生成一个不重复的long类型数据;
建议是:没有特殊需求就使用默认的1L。
序列化不保存静态变量。
因为序列化保存的是对象的状态,静态变量是属于类的状态的,因此序列化不会保存静态变量。
这篇文章讲的比较清晰,个人觉得不错:[Java 序列化的高级认识(转载)]
三.序列化和反序列化使用
序列化的实现方式:
java.io.ObjectOutputStream类,继承自OutputStream,将Java对象的原始数据类型写到文件,实现对象的持久化存储。构造方法:
ObjectOutputStream(OutputStream out):创建写入指定 OutputStream 的 ObjectOutputStream序列化写出对象方法:
public final void writeObject(Object obj):将指定的对象写入 ObjectOutputStream。序列化操作步骤:
- 创建一个ObjectOutputStream输出流。
- 调用ObjectOutputStream对象的writeObject输出可序列化对象。
示例:
import java.io.Serializable; public class Person implements Serializable{
public static final long serialVersionUID = 1L;
public String name;
public int age; public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
import java.io.*; public class TestObjectOutputStream {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
Person p = new Person("zhangsan", 20);
Person p1 = new Person("lisi", 30); oos.writeObject(p);
oos.writeObject(p1); oos.close();
}
}
反序列化的实现方式:
java.io.ObjectInputStream类,继承自InputStream,将之前使用ObjectOutputStream序列化的原始数据恢复为对象 。构造方法:
ObjectInputStream(InputStream in):创建从指定InputStream读取的ObjectInputStream。反序列化读出对象方法:
public final Object readObject(): 从 ObjectInputStream 读取对象。反序列化操作步骤:
- 创建一个ObjectInputStream输入流。
- 调用ObjectInputStream对象的readObject()得到序列化的对象。
示例1:读取上面序列化的Person实例化对象
import java.io.*; public class TestObjectInputStream {
public static void main(String[] args) throws IOException,ClassNotFoundException{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt")); // 按写入的顺序读出
Person p = (Person)ois.readObject();
Person p1 = (Person)ois.readObject(); System.out.println("name:" + p.name + ",age:" + p.age);
System.out.println("name:" + p1.name + ",age:" + p1.age);
ois.close();
}
}
说明:
对于反序列化,在反序列化对象时候,必须是能够找到对应的class文件的类才行,如果找不到该类的class文件,则会抛出一个ClassNotFoundException。
反序列化还可能出现另一个异常:InvalidClassException。
可能的原因有以下几点:
- 该类的序列化ID与从流中读出来的序列化ID不一致(使用serialVersionUID解决)
- 该类含有未知数据类型
- 该类没有可访问的无参构造方法。
Java IO---序列化和反序列化的更多相关文章
- Java之序列化和反序列化
序列化的对象: package test_demo.SerializableOper; import java.io.Serializable; /* * 序列化对象需要实现序列号接口 * */ pu ...
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- Java对象序列化和反序列化的工具方法
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- java之序列化与反序列化
1.这里主要是介绍Protobuf提供的序列化与反序列化的高效性.相对于传统的java提供的序列化来说,Protobuf的效率提高了很多倍.但是也有不足的地方,就是proto在对象序列化的时候抛弃了很 ...
- Java基础—序列化与反序列化(转载)
转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...
- Java 中序列化与反序列化
一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...
- Java IO: 序列化与ObjectInputStream、ObjectOutputStream
作者:Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和O ...
- Java对象序列化与反序列化一 JSON
Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student { private String nam ...
- java IO 对象流 反序列化和序列化
例: 重点:需要序列化的对象必须实现Serializable接口 //需要序列化的对象 public class User implements Serializable { private Stri ...
- JAVA IO 序列化与设计模式
➠更多技术干货请戳:听云博客 序列化 什么是序列化 序列化:保存对象的状态 反序列化:读取保存对象的状态 序列化和序列化是Java提供的一种保存恢复对象状态的机制 序列化有什么用 将数据保存到文件或数 ...
随机推荐
- 谷歌学术出现We're sorry解决办法
出现这个的原因应该是同ip段的或者就是这个ip曾经是个google的黑名单ip,因为恶意爬取谷歌学术了.解决办法就是申请Hurricane Electric Free IPv6 Tunnel Brok ...
- C#中Equals 与== 的区别
这个问题听说是大公司面试都会问的问题,以前不怎么了解,好奇心勾引我来研究一下 首先从值类型分析,先写几句简单的代码供测试用,二行语句输出的都是true, 说明==与Equals功能是相同的, 判断的都 ...
- 红黑树与AVL树比较
链接地址:https://blog.csdn.net/zhangkunrun/article/details/38336543 B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由于树的深 ...
- go实现tcp 服务器
我们将使用 TCP 协议和协程范式编写一个简单的客户端-服务器应用,一个(web)服务器应用需要响应众多客户端的并发请求:Go 会为每一个客户端产生一个协程用来处理请求.我们需要使用 net 包中网络 ...
- Android 开发基础入门篇: Android Studio 导入工程
最简单的方式 等待加载完就好了
- 归并排序 MergeSort
今天第一次看懂了严奶奶的代码( ̄▽ ̄)~*,然后按照厌奶那的思路进行了一波coding,稍加调试后即可跑起来. 学习链接:排序七 归并排序.图解排序算法(四)之归并排序 merge函数:将两个有序序列 ...
- 实验三:Linux进程管理(HDU)
2.设计内容 把下面的几个网址的内容看懂,关于Linux的通信机制就会有个基本的了解了,后面的这几个代码也应该可以看得懂了. 管道通信:https://blog.csdn.net/ljianhui/a ...
- html文本或元素6px间距问题
html中的文本内容或者是具有inline或inline-block的元素之间会6px的间距, 这是因为html文当中若出现文字分隔符(文字分隔符主要指空格或者换行等), 那么其就会被渲染成一个空格( ...
- Python网络爬虫神器PyQuery的使用方法
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests from pyquery import PyQuery as pq url ...
- Java 并发系列之四:java 多线程
1. 线程简介 2. 启动和终止线程 3. 对象及变量的并发访问 4. 线程间通信 5. 线程池技术 6. Timer定时器 7. 单例模式 8. SimpleDateFormat 9. txt ja ...