Java对象序列化原理以及Serializable接口
Java对象的序列化就是把一个对象变成二进制的数据流的一中方法,通过对象的序列化可以方便的实现对象的传输和存储。
原理是:对象------------->转换----------------->将对象转变为二进制的数据
在对象序列化时,只有其属性被序列化(每个对象都具备相同的方法,但是每个对象的属性不一定相同,也就是说对象保存的只有其属性信息)
那么一个类的对象要被序列化,这该类就必须实现java.io.Serializable接口,其源码如下:
public interface Serializable {
}
可以发现此接口没有定义任何的方法,此接口只是一个标识接口,表示一个类具备了别序列化的能力。
如果要完成对象的输入或输出,必须依赖对象的输入流(ObjectInputStream)和 对象输出流(ObjectOutputStream)。
1、使用对象输出流输出序列化对象的过程称之为序列化。
2、使用对象输入流读入对象的过程称之为反序列话。
程序-------------->ObjectOutputStream------------------->序列化对象<----------------------ObjectInputStream-----------------------------程序
序列化 反序列化
一、ObjectOutputStream对象输出流
他是OutputStream字节数出流的子类,主要有如下方法:
1、 public ObjectOutputStream(OutputStream out) throw IOException 构造方法 如传入输出流对象
2、 public final void writeObject(Object obj) throw IOException 输出对象
其实现如下:
定义一个序列化类。
package andy.serializable.test;import java.io.Serializable;/*** @author Zhang,Tianyou version:2014-11-20 下午2:41:12* * */public class Student implements Serializable {/*** */private static final long serialVersionUID = 6095384564471868081L;// 实现serializable是指成为序列化类private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
将对象输出到文件d:tes.txt 文件中:
package andy.serializable.test;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;/** * @author Zhang,Tianyou * version:2014-11-20 下午2:45:24 * * */public class ObjectOutputStreamTest {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {// TODO Auto-generated method stubFile file = new File("d:" + File.separator + "test.txt");ObjectOutputStream oos = null;OutputStream outputStream = new FileOutputStream(file);oos = new ObjectOutputStream(outputStream);oos.writeObject(new Student("小明", 23));outputStream.close();oos.close();}}
其二进制数据结果如下如下:
二、ObjectInputStream对象输入流
能够将被序列化的对象反序列话。是InputStream的子类,实例化是必须接受一个InputStream输入流对象。
其主要方法如下:
1、public ObjectInputStream(InputStream in) throw IOException 构造方法
2、public final Object readObject() throw IOException, ClassNotFoundException 读取指定位置的对象
其实现如下:
package andy.serializable.test;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;/*** @author Zhang,Tianyou version:2014-11-20 下午2:45:46* * */public class ObjectInputStreamTest {/*** @param args* @throws IOException* @throws ClassNotFoundException*/public static void main(String[] args) throws IOException,ClassNotFoundException {// TODO Auto-generated method stubFile file = new File("d:" + File.separator + "test.txt");ObjectInputStream ois = null;InputStream inputStream = new FileInputStream(file);ois = new ObjectInputStream(inputStream);Object obj = ois.readObject();Student student = (Student) obj;ois.close();inputStream.close();System.out.println("test内容: name:" + student.getName() + "age:"+ student.getAge());}}
运行如下:
test内容: name小明age:23
三、也可以自定义序列化接口,可以指定自己希望序列化的内容,只需实现Externalizable接口。
四、Serializable接口实现的操作实际是将一个对象的全部属性进行了序列化,当然也可以通过Externalizable接口实现部分属性的序列化,但更简便的方法是使用transient关键字声明不需要序列化的接口。
例如:
private transient String name;
那么name是不会被序列化的。
Java对象序列化原理以及Serializable接口相关推荐
- 【java】Java对象为啥要实现Serializable接口?
1.概述 对于 Java 的序列化,我一直停留在最浅显的认知上--把那个要序列化的类实现 Serializbale 接口就可以了.我不愿意做更深入的研究,因为会用就行了嘛. 但随着时间的推移,见到 S ...
- Java对象为什么要实现Serializable接口?
Serializable接口的使用 一.引入问题 一般情况下,我们在定义实体类时会继承Serializable接口,类似这样: import java.io.Serializable;public c ...
- 代码即财富之我学Java对象序列化与反序列化(2)
2019独角兽企业重金招聘Python工程师标准>>> 我们在程序创建的Java对象都是存在于JVM内存中的,也就是Java对象的生命周期一定不会长于JVM,所以如何以一种持久化的方 ...
- 深入理解Java对象序列化
关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...
- 理解Java对象序列化
理解Java对象序列化 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在 ...
- java 对象怎么序列化,java对象序列化总结
java对象序列化小结 百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储 ...
- 关于 Java 对象序列化您不知道的 5 件事
数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...
- java对象序列化去掉字段_使用序列化查找对象中的脏字段
java对象序列化去掉字段 假设您正在开发一个将对象自动保存到数据库中的框架. 您需要检测两次保存之间所做的更改,以便仅保存已修改的字段. 如何检测脏场. 最简单的方法是遍历原始数据和当前数据,并分别 ...
- Java对象序列化的本机C / C ++类似性能
您是否曾经希望过像使用C ++这样的本地语言将Java对象转换成字节流一样快的速度? 如果您使用标准的Java序列化,您可能会对性能感到失望. Java序列化的目的是与尽可能快而紧凑地序列化对象的目的 ...
- java 对象序列化 数组_序列化-将任何对象转换为j中的字节数组
您要执行的操作称为"序列化". 有几种方法可以做到,但是如果您不需要花哨的东西,我认为使用标准Java对象序列化就可以了. 也许您可以使用这样的东西? package com.ex ...
最新文章
- 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
- shader 编程入门(一)
- python正则表达式处理txt_Python文本处理服务(re正则表达式例子)
- 中小学课java_java毕业设计_springboot框架的中小学排课与实现
- 2018.9.18opencv3.4.1 + vs 2017 community +win 10 x64+cmake 3.11.3终终终章!
- python导入excel模块_python使用openpyxl模块操作excel
- SQL高级---SQL NULL 值
- python 保留顺序去重_Python入门很简单,只要掌握3456点
- 机器学习代码实战——网格搜索和交叉验证(GridSearchCV)
- fluidsim元件库下载_FluidSIM4.5免费版
- 【领英如何一键批量有效地加好友?】
- 实现个人域名跳转指定网站
- moto Z2 Force ATT 版手机刷安卓8.0系统教程
- Javascript特效之可翻阅上一条下一条的动态文字
- 喜闻乐见的 2048 游戏 (附源码)
- 20190211 模拟训练 A. 大猫咪
- 遗传算法应用场景(制造业)总结
- 程序人生 - 996(二)马云:任何公司都不应该强制员工996
- 立体声混响效果器-Acon Digital Verberate 2.2.1 WiN-MAC
- PDF切边裁剪软件下载