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提供的一种保存恢复对象状态的机制 序列化有什么用 将数据保存到文件或数 ... 
随机推荐
- 目标检测论文解读13——FPN
			引言 对于小目标通常需要用到多尺度检测,作者提出的FPN是一种快速且效果好的多尺度检测方法. 方法 a,b,c是之前的方法,其中a,c用到了多尺度检测的思想,但他们都存在明显的缺点. a方法:把每图片 ... 
- UDP基础
			UDP主要特点: (1)UDP是无连接的,发送数据不需要建立连接,减少了开销和发送数据之前的时延. (2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持连接状态表. (3)UDP面向报 ... 
- RF元素定位的例子
			Execute Javascript $("input[type='button']").click() Comment Click Button css=input.login_ ... 
- jQuery对象和DOM对象转换,解决jQuery对象不能使用js方法的问题
			有时候想要jQuery对象使用js方法,但是jQuery对象是什么js方法都不能用,怎么办呢?方法其实很简单,只要转换jQuery和DOM对象就可以了. 方法一: var $cr = $(" ... 
- JLOI 2009 二叉树问题
			洛谷 P3884 [JLOI2009]二叉树问题 洛谷传送门 JDOJ 2024: [JLOI2009]二叉树问题 JDOJ传送门 Description 如下图所示的一棵二叉树的深度.宽度及结点间距 ... 
- Linux中的关机操作
			shutdown -h now //马上停止服务进行关机 shutdown -h 12:00 .//在12点后进行关机 shutdown -h +10 //在10分钟后进行关机 shutdown ... 
- Django 1.11 shell中模块导入问题
			django报错:django.core.exceptions.ImproperlyConfigured: 处理办法 import os os.environ['DJANGO_SETTINGS_MOD ... 
- ZROI 暑期高端峰会 A班 Day4 树上数据结构
			FBI Warning:本文含有大量人类的本质之一. 你经历过绝望吗? [ZJOI2007]捉迷藏 询问树上最远黑点对. 动态边分治可以比点分治少一个 \(\log\). bzoj3730 咕了. [ ... 
- vue  CSS使用/deep/
			比如你使用了别人的组件或者自己开发一个组件,有时候你修改一处就可能影响到别的地方,这个时候要么你不用别人的组件,自己重新封装一个,但很多时候是不太现实的,所以就需要有一个方法或者方式,既不影响到别的地 ... 
- Eclipse对spring-boot,spring-boot-mybatis的搭建
			1.准备工作 1.1.如果没有sts(spring tool suite)插件, 则需要下载. 1.1.1.eclipse下载的话,一定要注意版本,因为eclipse会直接下载最新版本,如果ts版本 ... 
