文档章节

Java 序列化

淡看江湖
 淡看江湖
发布于 2016/04/12 22:32
字数 1036
阅读 25
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

整个过程都是Java虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

类ObjectInputStream 和ObjectOutputStream是高层次的数据流,它们包含序列化和反序列化对象的方法。

ObjectOutputStream 类包含很多写方法来写各种数据类型,但是一个特别的方法例外:

public final void writeObject(Object x) throws IOException

上面的方法序列化一个对象,并将它发送到输出流。相似的ObjectInputStream 类包含如下反序列化一个对象的方法:

public final Object readObject throws IOException,ClassNotFoundException

该方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,你需要将它转换成合适的数据类型。

为了演示序列化在Java中是怎样工作的,我将使用之前教程中提到的Employee类,假设我们定义了如下的Employee类,该类实现了Serializable 接口。

public > Employee implements java.io.Serializable
{public String name;public String address;public transient int SSN;public int number;public void mailCheck{System.out.println("Mailing a check to " + name
 + " " + address);}
}

请注意,一个类的对象要想序列化成功,必须满足两个条件:

该类必须实现 java.io.Serializable 对象。

该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

如果你想知道一个Java标准类是否是可序列化的,请查看该类的文档。检验一个类的实例是否能序列化十分简单, 只需要查看该类有没有实现java.io.Serializable接口。

序列化对象

ObjectOutputStream 类用来序列化一个对象,如下的SerializeDemo例子实例化了一个Employee对象,并将该对象序列化到一个文件中。

该程序执行后,就创建了一个名为employee.ser文件。该程序没有任何输出,但是你可以通过代码研读来理解程序的作用。

注意:当序列化一个对象到文件时, 按照Java的标准约定是给文件一个.ser扩展名。

import java.io.*;

public > SerializeDemo
{public static void main(String [] args){Employee e = new Employee;
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;try{FileOutputStream fileOut =new FileOutputStream("/tmp/employee.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(e);out.close;
         fileOut.close;System.out.printf("Serialized data is saved in /tmp/employee.ser");}catch(IOException i){
 i.printStackTrace;}}
}

反序列化对象

下面的DeserializeDemo程序实例了反序列化,/tmp/employee.ser存储了Employee对象。

import java.io.*;
public > DeserializeDemo
{public static void main(String [] args){Employee e = null;try{FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject;in.close;
         fileIn.close;}catch(IOException i){
         i.printStackTrace;return;}catch(ClassNotFoundException c){System.out.println("Employee >);
         c.printStackTrace;return;}System.out.println("Deserialized Employee...");System.out.println("Name: " + e.name);System.out.println("Address: " + e.address);System.out.println("SSN: " + e.SSN);System.out.println("Number: " + e.number);}
}

以上程序编译运行结果如下所示:

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

这里要注意以下要点:

readObject 方法中的try/catch代码块尝试捕获 ClassNotFoundException异常。对于JVM可以反序列化对象,它必须是能够找到字节码的类。如果JVM在反序列化对象的过程中找不到该类,则抛出一个 ClassNotFoundException异常。

注意,readObject方法的返回值被转化成Employee引用。

当对象被序列化时,属性SSN的值为111222333,但是因为该属性是短暂的,该值没有被发送到输出流。所以反序列化后Employee对象的SSN属性为0。


其实有个问题很好奇,希望有大神能解答一下,单例模式怎么避免在序列化时出现多个对象


淡看江湖
粉丝 36
博文 124
码字总数 100258
作品 0
浦东
后端工程师
私信 提问
加载中
请先登录后再评论。
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1K
0
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.3K
0
libqt4json

libqt4jon 是一个使用 Qt QVariant 对象的 JSON 序列化和反序列化库。可系列化原生类型如 integer, double, QString, lists, maps, and QObject recursively. 只序列化通过 QObject Q_PROPER...

匿名
2013/03/29
376
0
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
4.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Smartbi数据分析工具处理大数据性能如何?

为什么需要跨库整合能力 Smartbi支持多种数据源轻松接入,基本涵盖了市面上所有主流的数据库。无可否认多元的数据连接能力使Smartbi能快速连接现有数据源,构建统一的数据分析平台。但在项目...

osc_w0uxg75l
18分钟前
0
0
深入Vue 底层原理以及运行机制

Vue,React 这样的框架可以说是现在前端的必备技能,一个刚入门两三个月的前端都是要会Vue的,而且随着Vue3.0发布日程的推进,使用的人群变得多了,开始想去了解它。 Vue这么受大众接受,那么...

五月君
今天
0
0
好用的Excel大数据分析工具

为什么需要Excel分析 自助BI使得BI不再是高管领导的专利,促成了BI的平民化,更是BI的发展趋势。但自助BI工具的选择却并不简单,很多厂商推出了自己的自助分析工具,但在企业的使用过程中,实...

osc_vuza8uho
19分钟前
6
0
企业玩转DevOps转型:由弱到强,只需7步

【摘要】 在参考业界方法并总结客户成功故事的基础上,本文提出了“七步法”路线图,希望能帮助更多的企业顺利进行DevOps转型。 从2009年诞生,DevOps已经悄然走过了10多个年头。Gartner在技...

华为云开发者社区
20分钟前
0
0
浙江日报丨AI赋能,如何抢占“智”高点

  今天在杭州市余杭区秒优服饰智能工厂,机器人将订单所需的面料辅料精准送到各个吊挂生产线,每台机器、每个工人的具体任务、实时进度等都化为大数据,显示在工厂的大屏幕上。作为一家今年...

osc_wfvuuuju
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部