一、什么是?为什么需要?

序列化(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)的更多相关文章

  1. Java序列化与反序列化三连问:是什么?为什么要?如何做?

    Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...

  2. java序列化与反序列化的使用

    个人博客 地址:http://www.wenhaofan.com/article/20180925214701 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字 ...

  3. Serializable详解(1):代码验证Java序列化与反序列化

    说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...

  4. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  5. [转] Java序列化与反序列化

    原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...

  6. Java序列化与反序列化(Serializable)

    Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...

  7. Java基础(五)-Java序列化与反序列化

    .output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...

  8. JAVA序列化和反序列化XML

    package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...

  9. Java序列化与反序列化(实践)

    Java序列化与反序列化(实践) 基本概念:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 昨天在一本书上 ...

  10. java序列化与反序列化(转)

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

随机推荐

  1. Logistic Regression 之错误翻译

    根据周志华老师的讲法,这里 logistic 是对数几率的意思,所以正确的翻译方法应该叫 对数几率回归, 所以不要以为这个东西叫 逻辑回归,逻辑回归是错误的翻译.

  2. python SyntaxError: EOL while scanning string literal

    错误原因是,字符串以 \ 结尾 或者字符串缺少引号. 写代码拼接windows 路径出现这个错误, 查资料才知道 python中字符串不能以 \ 结尾 我的代码如下 import os dirname ...

  3. 使用C++11实现完美资源管理

    1.资源管理包括内存管理.文件句柄等等需要进行打开(申请).关闭(释放)操作的过程 2.VS2010使用的C++规范,严格说来不是C++11,而是C++0x,但是一脉相承的 一:管理数组 相较于aut ...

  4. web images

    ps切图时,我们保存时会要求选择文件格式. 一般来说,如果图像的色彩丰富,没有透明度的要求,则选择为jpeg格式: 如果图像色彩不丰富,我们就选择为png-8的格式,注意:ps中要选择无杂边,无仿色 ...

  5. bootstrap colorscheme以及theme自动生成

    http://paintstrap.com/ 是一个根据adobe kuler color scheme自动生成theme 的工具,比较直观好用,对于调整前端theme有一定参考意义

  6. Retrofit-入门使用

    1. 在模块目录下的build.gradle dependencies { compile "com.squareup.retrofit2:retrofit:2.1.0" comp ...

  7. SVN学习---使用 Visual SVN 搭建SVN服务器

    1.1. 使用 Visual SVN 搭建SVN服务器 搭建纯粹SVN服务器 --- svn:// 访问资源 将SVN 和 Apache服务器整合 ,搭建web SVN服务器 ----  https: ...

  8. 根据操作系统进程号,查找sql语句

    有时需要根据操作系统编号查找正在执行的sql语句:select sess.username,sql1.SQL_TEXTfrom v$session sess,v$sqltext sql1,v$proc ...

  9. ZT 骆家辉宣布辞职 他给中国带来什么留下什么?

    骆家辉宣布辞职 他给中国带来什么留下什么? 字号|2013年11月20日 15:20    已有1933人阅读    57 导 读 美国驻华大使骆家辉20日上午发表声明,宣布辞职.骆家辉履任期间为中国 ...

  10. Posix多线程编程学习笔记

    Blaise Barney, Lawrence Livermore National Laboratory )标准制订了这一标准接口.依赖于该标准的实现就称为POSIX threads 或者Pthre ...