摘自 :http://www.runoob.com/java/java-serialization.html

 Java序列化

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

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

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

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

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

public final void writeObject(Object x) throws IOException

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

public final Object readObject() throws IOException,ClassNotFoundException

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

序列化对象

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

该程序执行后,就创建了一个名为 employee.ser文件。

package javaLearn;
import java.util.*;
import java.io.*; public class SerializeDemo{
public static void main(String[] args){
Employee e = new Employee();
e.name = "Tom";
e.address = "chengdu,sichuan";
e.SSN = 111222333;
e.number = 101;
try{
FileOutputStream fileout = new FileOutputStream("D:/Workspace/sqldemo/src/javaLearn/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileout);
out.writeObject(e);
out.close();
fileout.close();
}catch(IOException i){
i.printStackTrace();
}
}
} class Employee implements java.io.Serializable{
public String name;
public String address;
public transient int SSN;//transient注明不是可序列化的
public int number;
public void mailCheck(){
System.out.println("Mailing a check to"+name+" "+address);
}
}

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

  • 该类必须实现 java.io.Serializable 接口。
  • 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

如果想知道一个Java标准类是否是可序列化的,只需要查看该类有没有实现java.io.Serializable接口。

反序列化对象

package javaLearn;
import java.io.*; public class DeserializeDemo{
public static void main(String[] args){
Employee e =null;
try{
FileInputStream filein = new FileInputStream("D:/Workspace/sqldemo/src/javaLearn/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 class not found");
c.printStackTrace();
return;
} System.out.println("Name:"+e.name);
System.out.println("Address:"+e.address);
System.out.println("SSN:"+e.SSN);
System.out.println("Number:"+e.number);
}
}

运行结果:

Name:Tom
Address:chengdu,sichuan
SSN:0
Number:101

这里要注意以下要点:

readObject()方法中的 try/catch 代码块尝试捕获 ClassNotFoundException 异常。对于JVM可以反序列化对象,它必须是能够找到字节码的类。

如果JVM在反序列化对象的过程中找不到该类,则抛出一个 ClassNotFoundException 异常。

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

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

Java之旅_高级教程_序列化的更多相关文章

  1. Java之旅_高级教程_网络编程

    摘自:http://www.runoob.com/java/java-networking.html JAVA网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. j ...

  2. Java之旅_高级教程_实例_文件操作

    1.文件写入 import java.io.*; public class MainClass{ public static void main(String[] args){ try{ Buffer ...

  3. Java之旅_高级教程_实例_数组

    摘自:http://www.runoob.com/java/java-examples.html 1.数组排序及元素查找 以下实例演示了如何使用sort()方法对Java数组进行排序,及如何使用 bi ...

  4. Java之旅_高级教程_数据结构

    摘自:http://www.runoob.com/java/java-data-structures.html 了解即可 Java 数据结构 Java 工具包提供了强大的数据结构.在Java中的数据结 ...

  5. Java之旅_高级教程_多线程编程

    摘自:http://www.runoob.com/java/java-multithreading.html Java 多线程编程 Java 给多线程编程提供了内置的支持.一条线程指的是进程中的一条执 ...

  6. Java之旅_高级教程_实例_打印图形

    1.打印菱形 public class MainClass{ public static void main(String[] args){ printStar(10); } public stati ...

  7. FastStone Capture(FSCapture) 注册码 _图形图像_软件教程_脚本之家

    FastStone Capture(FSCapture) 注册码 _图形图像_软件教程_脚本之家 FastStone Capture 注册码 序列号: name/用户名:TEAM JiOO key/注 ...

  8. Java之旅_高级教程_URL处理

    摘自 :http://www.runoob.com/java/java-url-processing.html Java URL 处理 URL(Uniform Resource Locator)中文名 ...

  9. java之旅_高级教程_java泛型

    摘自:http://www.runoob.com/java/java-generics.html JAVA泛型 java泛型(generics)是JDK5中引入的新特性,泛型提供了编译时类型安全检测机 ...

随机推荐

  1. java框架篇---hibernate(多对多)映射关系

    以学生和老师为例的来讲解多对多映射. 实体类: Student package cn.itcast.g_hbm_manyToMany; import java.util.HashSet; import ...

  2. mysql解决大量time_wait

    mysql解决大量time_wait     命令查看TIME_WAIT连接数 netstat -ae|grep "TIME_WAIT" |wc -l 早上登陆服务器的时候输入ne ...

  3. 假期小结 BIO, NIO, AIO

    虽然忙碌,但仍小有收获,开心. 引子 BIO: Blocking IO,阻塞式IO NIO: Non-blocking IO,非阻塞式IO AIO: Async IO,异步IO 问题 什么是阻塞式IO ...

  4. expect脚本同步文件 expect脚本指定host和要同步的文件 构建文件分发系统 批量远程执行命令

    自动同步文件 #!/usr/bin/expect set " spawn rsync -av root@.txt /tmp/ expect { "yes/no" { se ...

  5. 浅析C#中的结构体和类

    类和结构是 .NET Framework 中的常规类型系统的两种基本构造. 两者在本质上都属于数据结构.封装着一组总体作为一个逻辑单位的数据和行为. 数据和行为是该类或结构的"成员" ...

  6. ABBYY OCR技术教电脑阅读缅甸语(下)

    文本行检测到之后,我们开始寻找单词和字母之间的间隙,这一次,我们运用了水平直方图,将大的间隙假设为单词之间的空隙,小的间隙理解为字母之间的空隙,检测缅甸文本中的空隙几乎没有出现问题,不像泰语,几乎没有 ...

  7. xampp+YII搭建网站

    一.安装xampp xampp专为php开发设计,需要的apache,mysql,php已经自带了.特别提醒,请下载PHP版本高于5.4支持Yii2.0的xampp 二.配置环境变量 在系统的环境变量 ...

  8. [UI] 06 - jQuery

    前言 From : http://www.runoob.com/jquery/jquery-intro.html Ref: jQuery 实例 一.什么是 jQuery ? jQuery是一个Java ...

  9. spray 处理 response 的通用函数

    def handleActorResponse: PartialFunction[Try[Any], (StatusCode, ResponseResult)] = { case Failure(ex ...

  10. Fiddler 安装与配置

    可以直接访问官网下载安装包 https://www.telerik.com/download/fiddler ,安装后需要配置浏览器的代理服务器为 Fiddler: 以谷歌浏览器为例:[设置]---[ ...