Java 序列化与反序列化(Serialization)
一、什么是?为什么需要?
序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,反序列化则为其逆过程。
内存的易失性;传输需要;一些应用场景中需要将对象持久化下来,以便在需要的时候进行读取。
二、JDK提供的API
java.io.ObjectOutputStream类的 writeObject(Object obj)方法
java.io.ObjectInputStream类的readObject()方法
对于Serializable,如果没有重写 writeObject和readObject,则调用默认的方法
Externalizable继承了Serializable,多了2个方法:writeExternal和readExternal,用来控制需要序列化哪些字段
三、实现方法
假定一个Person类,实现了Serializable或Externalizable接口
import java.io.Serializable; /**
* @Author: pf_xu
* @Date: 2019/3/5 12:37
* @Version 1.0
*/
public class Person implements Serializable { private int age;
private String name; public Person(int age, String name) {
this.age = age;
this.name = name;
} public void setAge(int age) {
this.age = age;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public String getName() {
return name;
} }
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput; /**
* @Author: pf_xu
* @Date: 2019/3/5 13:01
* @Version 1.0
*/
public class SpecialPerson implements Externalizable { private int age;
private String name; public SpecialPerson(){} public SpecialPerson(int age, String name) {
this.age = age;
this.name = name;
} public void setAge(int age) {
this.age = age;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public String getName() {
return name;
} @Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(age);
out.writeObject(name);
} @Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.age = (Integer) in.readObject();
this.name = (String)in.readObject();
}
}
import java.io.*; /**
* @Author: pf_xu
* @Date: 2019/3/5 12:40
* @Version 1.0
*/
public class SerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException { Person person = new Person(10,"Simon");
ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream("object1.out"));
oos1.writeObject(person);
ObjectInputStream ois1= new ObjectInputStream(new FileInputStream("object1.out"));
Person re_person = (Person) ois1.readObject();
System.out.println(re_person.getName()+"---"+re_person.getAge()); SpecialPerson specialPerson = new SpecialPerson(30,"Daniel");
ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream("object2.out"));
oos2.writeObject(specialPerson);
ObjectInputStream ois2= new ObjectInputStream(new FileInputStream("object2.out"));
SpecialPerson re_specialPerson = (SpecialPerson)ois2.readObject();
System.out.println(re_specialPerson.getName()+"---"+re_specialPerson.getAge()); }
}
四、一些细节
1.序列化ID
serialVersionUID 如果两个类的ID不同,则不能互相序列与反序列(可应用与版本控制,不同版本的类相互兼容或者不兼容)
2.安全性
由于其标准化导致其有泄露的风险(二进制明文,可采用加密的方法)
Java 序列化与反序列化(Serialization)的更多相关文章
- Java序列化与反序列化三连问:是什么?为什么要?如何做?
Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...
- java序列化与反序列化的使用
个人博客 地址:http://www.wenhaofan.com/article/20180925214701 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字 ...
- Serializable详解(1):代码验证Java序列化与反序列化
说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...
- Java序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- [转] Java序列化与反序列化
原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...
- Java序列化与反序列化(Serializable)
Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...
- Java基础(五)-Java序列化与反序列化
.output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...
- JAVA序列化和反序列化XML
package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...
- Java序列化与反序列化(实践)
Java序列化与反序列化(实践) 基本概念:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 昨天在一本书上 ...
- java序列化与反序列化(转)
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
随机推荐
- numpy用法介绍-未完待续
简介 NumPy(Numerical Python简称) 是高性能科学计算和数据分析的基础包 为什么使用? 标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元 ...
- Hush Framework框架配置(续) 转自《Android和PHP最佳实践》官方站
图书资源下载 Xampp 开发环境下载:http://pan.baidu.com/share/link?shareid=531771&uk=773037279 微博实例完整源码包下载:http ...
- MQ测试
2015年8月13日23:14:52 测试RabbitMq ====================== 千兆局域网:send ≍10000/s receive ≍7000/s 百兆局域网:send ...
- Redis 缓存穿透
Redis 缓存穿透 https://www.cnblogs.com/jiekzou/p/9212114.html 场景描述:我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容 ...
- Webpack笔记(一)——从这里入门Webpack
准备了挺久,一直想要好好深入了解一下Webpack,之前一直嫌弃Webpack麻烦,偏向于Parcel这种零配置的模块打包工具一些,但是实际上还是Webpack比较靠谱,并且Webpack功能更加强大 ...
- React Router V4.0学习笔记
最近在学习React Router,但是网站的教程多半还是3.X版本之前的,所以我只能在GitHub上找到React Router的官方文档在读.后来总结了一下,包括学习经验以及V3.X与V4.X的差 ...
- 如何在Windows中安装GitHub
1.使用Git 在Git官网下载Git安装包,双击开始安装即可.安装完毕之后,在Windows中会具有一个Git Bash命令行工具以及一个Git GUI客户端工具. 点击Download即可下载. ...
- 异常:Neither BindingResult nor plain target object for bean name 'command' available as request attribute
Neither BindingResult nor plain target object for bean name 'command' available as request attribute ...
- JPA注解实现联合主键
当表中一个主键不能唯一标识一条记录的时候,就需要使用联合主键了,下面是使用JPA注解实现联合主键的代码 1 首先需要建立一个复合主键类,用来存放需要生产联合主键的属性,该类需要实现序列化. packa ...
- BZOJ2820:YY的GCD(莫比乌斯反演)
Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必 ...