摘自 :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. [C++]Qt文本操作(按行读写)

    资料来源:https://blog.csdn.net/flyfish1986/article/details/79487104 #include <QDebug> #include < ...

  2. vue深入相应式原理

    Vue 最显著的特性之一便是不太引人注意的响应式系统(reactivity system).模型层(model)只是普通 JavaScript 对象,修改它则更新视图(view).这会让状态管理变得非 ...

  3. Java知多少(22)方法重载

    在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺 ...

  4. ORA-00001: unique constraint (...) violated并不一定是数据冲突

    原文链接:http://blog.163.com/jet_it_life/blog/static/205097083201301410303931/ 收到一位测试人员RAISE的JIRA,说在某张表上 ...

  5. [Laravel] 13 - WEB API : update & error tracking

    前言 一.大纲 Ref: https://www.imooc.com/video/3134 版本升级分析以及数据表设计 版本升级分析 掌握如何设计版本升级数据表 版本升级接口开发以及APP演示 二.数 ...

  6. android高级---->Handler的原理

    andriod提供了Handler来满足线程间的通信,上次在更新UI的时候也提到过Handler的使用,关于Handler的基本使用,参见博客(android基础---->子线程更新UI).今天 ...

  7. 10.8Xadmin url注册

    2018-10-8 16:45:31 这两天在弄我的服务器,就是是看各种教程 死活部署不好我的Django项目 博客网站 过几天再弄! 越努力,越幸运!永远不要高估自己! 通过两个方法,通过类变量找到 ...

  8. DB2的进程/线程解析(转)

    今天看到一个名词,数据库实例用户和实例隔离用户,那么什么是实例隔离用户呢,于是搜索以下,就涉及到了进程. 援引DB2中国上面的回答:   要理解DB2的fenced user, 需要先理解db2的fe ...

  9. AIX装机问题123

    好久没有实施,好记性不如好笔记,那就记录下吧 1文件系统创建挂载 通过smit工具很容易简单举例创建一个jfs2类型文件系统并挂载 创建lv smit mklv 创建jfs2类型文件系统 指定lv s ...

  10. Cross-origin plugin content from must have a visible size larger than 400 x 300 pixels, or it will be blocked. Invisible content is always blocked.

    Cross-origin plugin content from  must have a visible size larger than 400 x 300 pixels, or it will ...