雷林鹏分享:Java 序列化

  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 class 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 class 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 class 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 class not found");

  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。(编辑:雷林鹏 来源:网络|侵删)

原文地址:https://www.cnblogs.com/pengpeng1208/p/12660462.html

时间: 2024-11-03 03:55:47

雷林鹏分享:Java 序列化的相关文章

雷林鹏分享:JSP 简介

JSP 简介 什么是Java Server Pages? JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结束. JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分.网页开发者们通过结合HTML代码.XHTML代码.XML元素以及嵌入JSP操作和命令来编写JSP. JSP通过网页表单获取用户输入数据.访问数据库及其他数据源,然后动态地创建网页. JSP标签有多种

雷林鹏分享:Ruby 模块(Module)

Ruby 模块(Module) 模块(Module)是一种把方法.类和常量组合在一起的方式.模块(Module)为您提供了两大好处. 模块提供了一个命名空间和避免名字冲突. 模块实现了 mixin 装置. 模块(Module)定义了一个命名空间,相当于一个沙箱,在里边您的方法和常量不会与其他地方的方法常量冲突. 语法 module Identifier statement1 statement2 ........... end 模块常量命名与类常量命名类似,以大写字母开头.方法定义看起来也相似:

雷林鹏分享:PHP 安装

您需要做什么? 为了开始使用 PHP,您可以: 找一个支持 PHP 和 MySQL 的 Web 主机 在您自己的 PC 机上安装 Web 服务器,然后安装 PHP 和 MySQL 使用支持 PHP 的 Web 主机 如果您的服务器支持 PHP,那么您不需要做任何事情. 只要在您的 web 目录中创建 .php 文件即可,服务器将自动为您解析这些文件. 您不需要编译任何软件,或安装额外的工具. 由于 PHP 是免费的,大多数的 Web 主机都提供对 PHP 的支持. 在您自己的 PC 机上建立 P

雷林鹏分享:Ruby 多线程

Ruby 多线程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程. Ruby 中我们可以通过 Thread 类来创建多线程,Ruby的线程是一个轻量级的,可以以高效的方式来实现并行的代码. 创建 Ruby 线程 要启动一个新的线程,只需要调用 Thread.new 即可: # 线程 #1 代码部分 Thread.new { # 线程 #2 执行代码 } # 线程 #1 执行代码 实例 以

雷林鹏分享:Ruby JSON

Ruby JSON 本章节我们将为大家介绍如何使用 Ruby 语言来编码和解码 JSON 对象. 环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块.在安装该模块前你需要先安装 Ruby gem,我们使用 Ruby gem 安装 JSON 模块. 但是,如果你使用的是最新版本的 Ruby,可能已经安装了 gem,解析来我们就可以使用以下命令来安装Ruby JSON 模块: $gem install json 使用 Ruby 解析 JSON 以下为J

雷林鹏分享:Ruby CGI方法

Ruby CGI方法 以下为CGI类的方法列表: 序号方法描述 1CGI::new([ level="query"]) 创建 CGI 对象.query可以是以下值: query: 没有 HTML 生成输出 html3: HTML3.2 html4: HTML4.0 Strict html4Tr: HTML4.0 Transitional html4Fr: HTML4.0 Frameset 2CGI::escape( str) 使用 URL 编码来转义字符串 3CGI::unescape

雷林鹏分享:Ruby 异常

Ruby 异常 异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在程序执行期间发生,所以要采取适当的行动,而不至于让程序完全停止. Ruby 提供了一个完美的处理异常的机制.我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型. 语法 begin # - rescue OneTypeOfExce

雷林鹏分享:Ruby 面向对象

Ruby 面向对象 Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象.类本身也是一个对象,是 Class 类的一个实例.本章将向您讲解所有与 Ruby 面向对象相关的主要功能. 类用于指定对象的形式,它结合了数据表示法和方法,把数据整理成一个整齐的包.类中的数据和方法被称为类的成员. Ruby 类定义 当您定义一个类时,您实际是定义了一个数据类型的蓝图.这实际上并没

雷林鹏分享:Ruby File 类和方法

Ruby File 类和方法 File 表示一个连接到普通文件的 stdio 对象.open 为普通文件返回该类的一个实例. 类方法 序号方法 & 描述 1File::atime( path) 返回 path 的最后访问时间. 2File::basename( path[, suffix]) 返回 path 末尾的文件名.如果指定了 suffix,则它会从文件名末尾被删除. 例如:File.basename("/home/users/bin/ruby.exe") #=>