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接口相关推荐

  1. 【java】Java对象为啥要实现Serializable接口?

    1.概述 对于 Java 的序列化,我一直停留在最浅显的认知上--把那个要序列化的类实现 Serializbale 接口就可以了.我不愿意做更深入的研究,因为会用就行了嘛. 但随着时间的推移,见到 S ...

  2. Java对象为什么要实现Serializable接口?

    Serializable接口的使用 一.引入问题 一般情况下,我们在定义实体类时会继承Serializable接口,类似这样: import java.io.Serializable;public c ...

  3. 代码即财富之我学Java对象序列化与反序列化(2)

    2019独角兽企业重金招聘Python工程师标准>>> 我们在程序创建的Java对象都是存在于JVM内存中的,也就是Java对象的生命周期一定不会长于JVM,所以如何以一种持久化的方 ...

  4. 深入理解Java对象序列化

    关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...

  5. 理解Java对象序列化

    理解Java对象序列化 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在 ...

  6. java 对象怎么序列化,java对象序列化总结

    java对象序列化小结 百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储 ...

  7. 关于 Java 对象序列化您不知道的 5 件事

    数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...

  8. java对象序列化去掉字段_使用序列化查找对象中的脏字段

    java对象序列化去掉字段 假设您正在开发一个将对象自动保存到数据库中的框架. 您需要检测两次保存之间所做的更改,以便仅保存已修改的字段. 如何检测脏场. 最简单的方法是遍历原始数据和当前数据,并分别 ...

  9. Java对象序列化的本机C / C ++类似性能

    您是否曾经希望过像使用C ++这样的本地语言将Java对象转换成字节流一样快的速度? 如果您使用标准的Java序列化,您可能会对性能感到失望. Java序列化的目的是与尽可能快而紧凑地序列化对象的目的 ...

  10. java 对象序列化 数组_序列化-将任何对象转换为j中的字节数组

    您要执行的操作称为"序列化". 有几种方法可以做到,但是如果您不需要花哨的东西,我认为使用标准Java对象序列化就可以了. 也许您可以使用这样的东西? package com.ex ...

最新文章

  1. 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
  2. shader 编程入门(一)
  3. python正则表达式处理txt_Python文本处理服务(re正则表达式例子)
  4. 中小学课java_java毕业设计_springboot框架的中小学排课与实现
  5. 2018.9.18opencv3.4.1 + vs 2017 community +win 10 x64+cmake 3.11.3终终终章!
  6. python导入excel模块_python使用openpyxl模块操作excel
  7. SQL高级---SQL NULL 值
  8. python 保留顺序去重_Python入门很简单,只要掌握3456点
  9. 机器学习代码实战——网格搜索和交叉验证(GridSearchCV)
  10. fluidsim元件库下载_FluidSIM4.5免费版
  11. 【领英如何一键批量有效地加好友?】
  12. 实现个人域名跳转指定网站
  13. moto Z2 Force ATT 版手机刷安卓8.0系统教程
  14. Javascript特效之可翻阅上一条下一条的动态文字
  15. 喜闻乐见的 2048 游戏 (附源码)
  16. 20190211 模拟训练 A. 大猫咪
  17. 遗传算法应用场景(制造业)总结
  18. 程序人生 - 996(二)马云:任何公司都不应该强制员工996
  19. 立体声混响效果器-Acon Digital Verberate 2.2.1 WiN-MAC
  20. PDF切边裁剪软件下载

热门文章

  1. 极客大学产品经理训练营 产品文档和原型 第7课总结
  2. php 老是报错没有定义,php中的错误处理与异常处理机制介绍
  3. Axure实操笔记之axure炫酷的作者信息设置
  4. MySQL基本知识笔记
  5. linux不解压情况下查看压缩包内文件的总行数、文件列表的数目
  6. Nodejs自带模块querystring的使用简介
  7. 简单记录 Part1.1
  8. 实现一个定时任务管理器
  9. how to set up github blog
  10. 解决linux 运行自动化脚本浏览器无法启动问题