.什么是串行化

对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己

,这个过程叫对象的串行化(Serialization-连续)

。串行化的主要任务是写出对象实例变量的数值。如果变量是另一对象的引用,则引用的对象也要串行化。这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括原有对象、对象的对象、对象的对象的对象等等。对象所有权的层次结构称为图表(graph)。

2.串行化的目的

Java对象的单行化的目标是为Java的运行环境提供一组特性,如下所示:

1) 尽量保持对象串行化的简单扼要 ,但要提供一种途径使其可根据开发者的要求进行扩展或定制。

2) 串行化机制应严格遵守Java的对象模型 。对象的串行化状态中应该存有所有的关于种类的安全特性的信息。

3) 对象的串行化机制应支持Java的对象持续性。

4) 对象的串行化机制应有足够的 可扩展能力以支持对象的远程方法调用(RMI)。

5) 对象串行化应允许对象定义自身 的格式即其自身的数据流表示形式,可外部化接口来完成这项功能。

二、串行化方法

从JDK1.1开始,Java语言提供了对象串行化机制

,在java.io包中,接口Serialization用来作为实现对象串行化的工具

,只有实现了Serialization的类的对象才可以被串行化。

Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时,只是表明该类参加串行化协议,而不需要实现任何特殊的方法。下面我们通过实例介绍如何对对象进行串行化。

1.定义一个可串行化对象

一个类,如果要使其对象可以被串行化,必须实现Serializable接口。我们定义一个类Student如下:

class Student implements Serializable {

//1 首先定义了一个类Student,实现了Serializable接口

int

id;

String

name;

int

age;

transient

String department;

// Java语言的关键字[保留字],用来表示一个域不是该对象串行化的一部分。

public

Student(int id, String name, int age, String department) {

this.id = id;

this.name = name;

this.age = age;

this.department = department;

}

}

2.构造对象的输入/输出流

要串行化一个对象,必须与一定的对象输出/输入流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。

java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象

。在ObjectInputStream

中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。

package com.gwssi.study.pkg3;

import java.io.*;

public class ObjectSer {

public

static void main(String args[]) throws

IOException,ClassNotFoundException{

Student stu = new Student(101972040, "YaoMing", 27,

"basketball");

FileOutputStream fo = new FileOutputStream("data.ser");

ObjectOutputStream so = new ObjectOutputStream(fo);

try {

//2 通过对象输出流的writeObject()方法将Student对象保存到文件 data.ser中

so.writeObject(stu);

so.close();

} catch (IOException e) {

System.out.println(e);

}

stu = null;

FileInputStream fi = new FileInputStream("data.ser");

ObjectInputStream si = new ObjectInputStream(fi);

try {

//3 通过对家输入流的readObjcet()方法从文件data.ser中读出保存的Student对象

stu = (Student)si.readObject();

si.close();

} catch (IOException ex) {

System.out.println(ex);

}

//4 从运行结果可以看到,通过串行化机制,可以正确地保存和恢复对象的状态

System.out.println("Student Info:");

System.out.println("ID:" + stu.id);

System.out.println("Name:" + stu.name);

System.out.println("Age:" + stu.age);

System.out.println("Dep:" + stu.department);

}

}

运行结果如下:

Student Info:

ID:101972040

Name:YaoMing

Age:27

Dep:null

在这个例子中,

1首先定义了一个类Student,实现了Serializable接口

2通过对象输出流的writeObject()方法将Student对象保存到文件 data.ser中

3通过对家输入流的readObjcet()方法从文件data.ser中读出保存的Student对象

4从运行结果可以看到,通过串行化机制,可以正确地保存和恢复对象的状态

三、串行化的注意事项

1.串行化能保存的元素

串行化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。

2.transient关键字

对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的。例如一个Thread对象或一个FileInputStream对象

,对于这些字段,我们必须用transient关键字标明,否则编译器将报措。

另外 ,串行化可能涉及将对象存放到

磁盘上或在网络上发达数据,这时候就会产生安全问题。因为数据位于Java运行环境之外,不在Java安全机制的控制之中。对于这些需要保密的字段,不应保存在永久介质中

,或者不应简单地不加处理地保存下来 ,为了保证安全性。应该在这些字段前加上transient关键字。

java 串行化_Java中的串行化相关推荐

  1. java中的命令行参数_Java中的命令行参数

    java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...

  2. java 接收命令行参数_java中的命令行参数_Java中的命令行参数

    java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...

  3. java string对象名称_java中常见对象——String

    字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. A:字符串字面值"abc"也可以看成是一个字符串对象. B:字符串是常量,一旦被赋值,就不能被改变. 构造方法: ...

  4. java 整形数组初始化_java中怎么数组初始化?

    展开全部 当你产生某个存储对象的数组时,真正产生的其实是个存储references的数组.此一数组建立之后,其中62616964757a686964616fe4b893e5b19e3133336564 ...

  5. java 链接重排序_JAVA中JVM的重排序详细介绍

    重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段.重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境 在并发程序中,程序员会特别关注不同进程或 ...

  6. java的printf语法_Java中printf的用法总结

    printf的格式控制的完整格式:%  -  0  m.n  l或h格式字符下面对组成格式说明的各项加以说明:①%:表示格式说明的起始符号,不可缺少.②-:有-表示左对齐输出,如省略表示右对齐输出.③ ...

  7. java excel 导入导出_java中excel文件的导入和导出

    如有需要可以加我Q群[308742428]大家一起讨论技术,提供技术支持. 后面会不定时为大家更新文章,敬请期待. 前端上传excel文件到后台,后台接收后保存数据到数据库. 这里需要说明的一点是前端 ...

  8. java读取文件 路径_Java中的获取文件的物理绝对路径,和读取文件

    获取文件的绝对路径,读取该文件 一.文件目录打印图 下面的文件目录图,是项目中文件的位置信息:下面的例子是按照这个图来演示的. . |-- java | |-- ibard | | |-- demo1 ...

  9. java 异常处理发生异常_Java中的异常处理

    java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...

  10. java能否构成三角形_java中判断三个参数是否能构成三角形的方法

    java中判断三个参数是否能构成三角形的方法 发布时间:2020-06-25 14:02:58 来源:亿速云 阅读:171 作者:Leah 这篇文章将为大家详细讲解有关java中判断三个参数是否能构成 ...

最新文章

  1. 基于TableStore的数据采集分析系统介绍
  2. cad 快捷键命令大全
  3. SpringBoot整合springDataJpa实现图片上传和显示
  4. 新的html页面拼接类库(简易的模板引擎)
  5. 【C#学习】delegate(委托) 和 event(事件)
  6. 也记一次性能优化:LINQ to SQL中Contains方法的优化
  7. ffmpeg开发指南(使用 libavformat 和 libavcodec)
  8. cod16 服务器正在维护,使命召唤16玩不了怎么办 使命召唤16进不去解决方法
  9. CCF 201509-1 数列分段
  10. #华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源
  11. 如何用python做一个时钟_Python使用turtle库制作一个时钟
  12. Oracle数据库集中复制方式浅议
  13. docker和vm虚拟机的区别
  14. 做vue项目时报错,Error: spawnSync C:\Program Files\Java\jre1.8.0_201 ENOENT的解决办法!!!简单粗暴!!!
  15. python主函数怎么写_python主方法怎么写
  16. VIRTIO-BLK-DATA-PLANE的配置使用
  17. 123457123457#0#-----com.yuming.ZuiNiuChengYu--前拼后广--最牛成语
  18. JAVA 实现 名单按姓氏笔画为序排列
  19. at指令 meid_【技术分享】使用AT调制解调器命令解锁LG Android屏幕
  20. android检测蜂窝网络,Android 判断网络状态及开启网路

热门文章

  1. tenacity.retry Python中一个专门用来重试的库
  2. 【官方教程】使用Quick-Cocos2d-x搭建一个横版过关游戏(三)
  3. 横版过关游戏开发-游戏流程
  4. 一文读懂Elephant Swap的LaaS方案的优势之处
  5. Linux之常见面试题知识点批注(六)
  6. Ruby-学习之路1.1
  7. Redhat7/Centos7服务器设置IP地址
  8. 苹果计算机快捷键设置在哪里,苹果手机快捷键小方块怎么设置 【设置方法】...
  9. 做LED照明类产品有感
  10. POJ 3368 Frequent values