Java序列化

2023-10-31

序列化机制

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

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

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

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

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

public final void writeObject(Object x) throws IOException

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

public final Object readObject() throws IOException, 
                                 ClassNotFoundException

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

假设我们定义了如下的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);
   }
}

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

  1. 该类必须实现 java.io.Serializable 接口。
  2. 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的(使用 transient 关键字)。

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

transient 关键字

被 transient 修饰的变量值在序列化时不会被持久化,因此当对象被反序列化时该变量值便不能恢复。

序列化对象

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

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();
      }
   }
}

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

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

反序列化对象

下面的 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

这里要注意以下要点:

  1. readObject() 方法中的 try/catch代码块尝试捕获 ClassNotFoundException 异常。对于 JVM 可以反序列化对象,它必须是能够找到字节码的类。如果JVM在反序列化对象的过程中找不到该类,则抛出一个 ClassNotFoundException 异常。
  2. 注意,readObject() 方法的返回值被转化成 Employee 引用。
  3. 当对象被序列化时,属性 SSN 的值为 111222333,但是因为该属性是短暂的,该值没有被发送到输出流。所以反序列化后 Employee 对象的 SSN 属性为 0。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java序列化 的相关文章

随机推荐

  • 图机器学习课程笔记7

    维生素C吃多了会上火 个人CSDN博文目录 cs224w 图机器学习 2021冬季课程学习笔记集合 目录 思维大纲 中文笔记 思维大纲 中文笔记
  • 树莓派入门教程 - 0 - 准备篇 - 0.3 树莓派串口访问终端

    电脑需要提前安装的工具 SSH 串口 终端神器 MobaXterm 官网下载链接 https mobaxterm mobatek net download html 使用到的硬件 USB转TTL模块 CH340 和 CP2102均可 CP2
  • 1.2-知识图谱有什么用?

    知识图谱经过几年的发展已经得到广泛的应用 当知识图谱遇上人工智能 更加突显出了它的优势和价值 最先应用于搜索 最典型的就是在谷歌搜索引擎里面应用 谷歌是在2012年率先提出来知识图谱的概念 提出这个概念的最主要的目的就是用于改善它的搜索引擎
  • ospf小结

    ospf卡住的原因 route id相同 认证不通过 区域ID不同 特殊区域标示不一致 优先级都为0 无法选举 MTU值不匹配 包的交互不完整 网络中丢包等 LSA加载不完全 hello包时间不一致 MA网络掩码不一致 虚链路建邻ABR的两
  • JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了

    JVM常量池最全详解 常量池 运行时常量池 字符串常量池 基本类型常量池 看这一篇就够了 常量池详解 1 字面量和符号引用 1 1 字面量 1 2 符号引用 2 常量池vs运行时常量池 3 常量池 静态常量池 4 运行时常量池 5 字符串常
  • Introduction to Scientific Programing and Simulation Using R chapter 04 答案

    strong span style font size 32px Ex1 span strong span style color 33cc00 programe cha4 6 ex1 img src https img blog csdn
  • h-a-p-p-e-n-before原则的理解

    happen before 可真是一个经典又老生常谈的话题 规则一共就八条 但看起来总有种抓不住重点的感觉 今天再整理一下对这八条规则的理解 首先我的理解是 happen before 的语义与在什么什么之前发生完全没有关系 其语义是如果
  • 网络安全实验室 综合关 解析

    网站地址 http hackinglab cn ShowQues php type pentest 第一关 渗透测试第一期 先看看 登录界面 发现可以注册和忘记密码 忘记密码可以重置密码 思路如下 重置admin密码 发现 不能直接重置密码
  • 【赠书活动|第四期《互联网广告系统:架构、算法与智能化》】

    文章目录 内容简介 作者简介 读者对象 大咖推荐 抽奖方式 本期中奖者 广告平台的建设和完善是一项长期工程 例如 谷歌早于2003年通过收购Applied Semantics开展Google AdSense 项目 而直到20年后的今天 谷歌
  • sql连接查询

    sql连接查询 单表查询 student表 select 列名 from 表名 查看全表 SELECT FROM student 可以匹配为全选 在student表中查找赵六的信息 SELECT FROM student WHERE sna
  • 插入时出现MyBatisSystemException: nested exception is

    检查完xml文件没错后 还是出现错误 org mybatis spring MyBatisSystemException nested exception is org apache ibatis binding BindingExcept
  • SourceInsight4.0黑色背景主题

    SourceInsight4 0黑色背景主题 在网上找了一通花了好多积分最后发现只改了代码区 左右代码索引文件列表和函数调用关系图都还是白底 最后自己在设置里面找了找 发现在这个版本中SI已经内置了一些常用的主题配色 先放效果图 设置在这里
  • JAVA设计模式(21) —装饰(Decorator)模式

    定义 动态的给一个对象添加一些额外的职责 就增加功能来说 Decorator模式相比生成子类更为灵活 类型 对象结构型模式 别名 包装模式 Wrapper 类图 Decorator装饰模式是一种结构型模式 它主要是解决 过度地使用了继承来扩
  • Python3实现通过HTTP协议进行文件上传及下载

    要实现这个功能 你需要在主机A上编写一个Python程序 该程序监听HTTP上传请求并处理上传的文件 同时 在主机B上 你可以使用任何支持HTTP POST请求的工具 如curl或浏览器插件 上传文件 以下是一个简单的实现示例 在主机A上的
  • Python opencv学习-4在图片上用鼠标绘制矩形区域、绘制矩形框、曲线等

    程序功能鼠标按下 拖拽生成矩形框 缺陷 拖过的区域涂黑 而且不彻底 后期换写法测试 基本逻辑 鼠标按下松开 获取坐标 绘制矩形等 未看明白如何获取到的初始坐标和结束坐标 x y从哪获取的值 import numpy as np import
  • Node.js 入门 —— 中间件

    文章目录 1 前言 2 中间件的概念 2 1 什么是中间件 2 2 中间件的调用流程 2 3 Express 中间件的格式 3 express 中间件 3 1 定义中间件函数 3 2 全局生效的中间件 3 3 局部生效的中间件 3 4 中间
  • 深度学习------keras,torch对mnist,cifar2,cifar3,cifar10数据集的读取总结

    1 tensorflow读取 1 1 mnist数据集 import tensorflow as tf from tensorflow keras datasets import mnist cifar10 cifar100 train x
  • mysql与java编写人事管理系统,java+mysql企业人事管理系统的设计

    摘 要 随着历史脚步的前进 我们步入了科技高速发展的二十一世纪 互联网技术得到了空前发展 极大地提高了人们工作的效率 改善了人们的工作生活 产业信息化管理已经成为提高企业生产与管理效率的首要选择 然而 在人事管理模块 国内的很多中小型企业依
  • 错误:非法字符:“\ufeff”

    导入开源的项目的时候 你可以碰到以上的编码问题 这一般这个项目是用eclipse开发的 主要原因是 Eclipse可以自动把UTF 8 BOM文件转为普通的UTF 8文件 但Android Studio需要重新转一下 解决方法 将编码格式U
  • Java序列化

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