Java对象序列化

2023-11-10

Java 对象序列化

对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的 java 对象转换成为与平台无关的二进制流,从而允许把这种二进制流持久保存到磁盘上。

实现对象序列化:该类实现接口 serialize externlizable 即可

(1)   创建一个 ObjectOutputStream 对象 ;

(2)   调用 ObjectOutputStream 对象的 writeObject 方法;

public class TestSerial implements Serializable{

    public byte version = 100;

    public byte count = 0; 

    /**

     * @param args

     * @throws IOException

     */

    public static void main(String[] args) throws IOException {

       // TODO Auto-generated method stub

       FileOutputStream fos = new FileOutputStream( "temp.out" ); 

           ObjectOutputStream oos = new ObjectOutputStream(fos); 

           TestSerial ts = new TestSerial(); 

           oos.writeObject(ts);  

           oos.flush(); 

           oos.close();

    }

}

如果希望从二进制流中恢复 java 对象,则需要使用反序列化。

(1)   创建一个 ObjectInputStream 对象;

(2)   调用该对象的 readObject 方法。

在反序列化的时候,无须通过构造器来初始化 Java 对象;

如果向文件中使用序列化机制写入了多个 java 对象,使用反序列化机制恢复对象的时候,必须按实际写入顺序读取。

Java 对象的序列化机制算法:

(1)   所有保存到磁盘的对象都有一个序列化编号;

(2)   当程序视图序列化一个对象时,程序将首先检查该对象是否已经被序列化过,只有当该对象从未序列化过,系统才会将对象转化成为走空额序列输出;

(3)   如果对象已经序列化过,程序将直接输出一个序列化编号;

递归序列化 :

当对某个对象进行序列化的时候,系统会自动把该对象的所有属性依次序列化,如果某个属性引用了另外一个对象,则被引用的对象也会被序列化,这样依次下去。

自定义序列化有如下几种实现方式:

(1)   通过 transient 关键字修饰属性,该属性在就不会被序列化。

(2)   在该对象中重写 writeObject 方法和 readObject 方法。通过重写 writeObject 方法,程序员可以完全获得对序列化的控制。(调用 writeObject 方法、 writeInt 方法等等,相应地, readObject 调用 readObject readInt 方法就可以了)。

(3)   writeReplace 方法。这是一种更为彻底的自定义机制,它甚至可以在序列化对象的时候,将该对象替换为其它对象。 Java 的序列化机制保证在序列化某个对象之前,先调用该对象的 writeObject 方法,如果该方法返回另外一个 Java 对象,则系统转为序列化另一个对象。

(4)   Java 类实现 Externalizable 接口。 Externalizable 接口定义了两个方法: void readExternal(ObjectInput in): 用来实现反序列化; void writeExternal(ObjectOutput out) 。这个方法的实现,与重写 writeObject readObject 方法的方法体是一模一样的。

两种序列化机制的对比表如下:

 

实现 serializable 接口

实现 Externalizable 接口

系统自动存储必要信息

程序员决定存储哪些信息

Java 内建支持,易于实现

仅仅提供两空方法。

性能略差

性能略高

 

关于对象的序列化,还要注意一下几点:
1
. 对象的类名、属性(包括基本属性、数组、对其他对象的引用)都会被序列化;方法、 static 属性、 transient 属性都不会被序列化;

2. 保证序列化对象的属性的类型也是可以序列化的;

3. 反序列化的时候,必须要有序列化对象的 class 文件

4. 当通过文件、网络来读取序列化对象后,必须按照实际写入的顺序读取;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java对象序列化 的相关文章

随机推荐

  • mysql忘记密码及ssh连接

    mysql忘记密码 我们在安装mysql或者其他的时候会遇到忘记密码的时候 这时候就需要对密码进行重置 话不多说 直接上步骤 1 停止当前mysql服务 service mysqld stop 2 然后通过跳过权限验证启动mysql服务 m
  • 2008年7月51CTO.com十大热点文章排行榜

    刚刚过去的7月 热点新闻和精彩的技术文章还是不少的 以下是51CTO com各主要频道的精彩实用文章及简介 经典实用文章推荐 组网频道7月热点 网管人员必备的常用命令 Windows环境下有很多通过命令实现网络管理的非常有效的工具 可惜知道
  • 11-5 读写一行字符

    1 读一行字符 gets 与 gets s 都可以用做读取用户控制台输入的一行字符 gets 仅接收一个参数 char 意为读取到换行符时将读取内容全部保存到 char 中 该函数的问题在于无法判断出读取到换行符之前共有多少字符 故 cha
  • 在Repeater控件中创建可隐藏区(原作)

    在Repeater控件中创建可隐藏区 原作 最新的一篇作品 发表在天极网上 http dev yesky com SoftChannel 72342371945218048 20041227 1893718 shtml
  • Nginx 增加二级目录的反向代理时,最常见的两个问题

    当我们想在某个Nginx网站中增加一个两级目录 当然也可以是很多级 作为反向代理时 如果使用常见的单个Nginx反向代理配置的方法 非常容易遇到配置有问题的情况 主要由如下两个问题造成 1 因为不是独立配置反向代理 所以Nginx Conf
  • 数学建模论文常用LaTeX代码(2021美赛)

    数学建模论文常用LaTeX代码 图片 单图 begin figure htbp centering includegraphics width 9 textwidth XXX pdf 图片相对位置 caption xxx 图片标题 labe
  • Ts学习笔记

    any 任何类型都可以赋值给any any也可以给任何类型赋值 unknown 任何类型可以赋值给 unknown 但是 unknown 类型赋值给其它类型需要对其进行类型缩小 type 类型一般都是大写字母开头 type Fish nam
  • 敏捷开发知识体系笔记

    敏捷开发知识体系整体框架 敏捷开发工程实践 项目管理 迭代开发 风险价值生命周期 多级项目规划 完整团队 每日站立会议 任务板 燃尽图 需求管理 需求订单 业务流程草图 用例驱动开发 用户故事 架构 演进的架构 演进的设计 基于组件的架构设
  • 同步服务器安装系统,时间同步服务器的配置方法

    知道什么是时间同步服务器的配置方法吗 下面是学习啦小编跟大家分享的是时间同步服务器的配置方法 欢迎大家来阅读学习 时间同步服务器的配置方法 方法 步骤 双击任务栏右下角 时间 打开 时间和日期 属性 设置对话框 2选择 Internet时间
  • SimpleDateFormat用法详解

    SimpleDateFormat类是一个以语言环境敏感的方式来格式化和解析日期的工具类 它允许你将日期格式化为字符串 或从字符串解析为日期 格式化日期为字符串 SimpleDateFormat sdf new SimpleDateForma
  • 在linux下编译多线程需要如下设置

    编译时这样输入命令 gcc xxx c o xxx out lpthread
  • LeetCode知识点总结 - 1710

    LeetCode 1710 Maximum Units on a Truck 考点 难度 Sorting Easy 题目 You are assigned to put some amount of boxes onto one truck
  • Xilinx 7系FPGA LVDS使用要注意了,供电不能搞错

    最近新做了一块板子 用到Spartan 7芯片对前级视频源叠加OSD菜单 前级会将HMDI转成LVDS送给FPGA处理 在原理图设计阶段没有仔细阅读fpga手册 导致LVDS BANK供电错误 应该接2 5V 实际接3 3V 且BANK供电
  • 射频与无线技术入门 读书记录

    一 基础概念 无线系统框图 瓦特W 功率测量单位 能量 功率 时间 如100W的灯泡亮了2小时 能量就是100w 2 就是200W H的能量 波段 使用字母表示一定范围的频率 载波 载波只能使用模拟信号 在这个模拟信号上承载模拟或者数字信息
  • 跨域的解决方案

    一 跨域 1 概念 指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 是 浏览器对javascript施加的安全限制 2 同源策略 是指协议 域名 端口都要相同 其中有一个不同都会产生跨域 3 跨域流程 二 解决跨域方案 1
  • [转载] 陈皓——程序员技术练级攻略

    PS 原文出自酷壳上的陈皓对程序员从入门到精通的攻略 让你感受一下真正的大神吧 又是阿里人 他的文章真心不错 希望对你也有用 原文地址 http coolshell cn articles 4990 html 陈皓酷壳博客地址 http c
  • oracle failover mode,Oracle RAC FailOver配置

    Oracle RAC FailOver配置 Oracle RAC主要为数据库的应用提供了HA High Available 的环境 HA体现在负载均衡 loadbalance 和容错 failover 两个方面 Oracle RAC 的Fa
  • 机器学习---期望+方差+标准差+协方差

    1 期望 在概率论和统计学中 数学期望 mathematic expectation 或均值 亦简称期望 是试验中每次可能结果的概率乘以其结果的总和 是最基本的数学特征之一 它反映随机变量平均取值的大小 大数定律表明 随着重复次数接近无穷大
  • Optimal Coin Change(完全背包计数)

    题目描述 In a 10 dollar shop everything is worthy 10 dollars or less In order to serve customers more effectively at the cas
  • Java对象序列化

    Java 对象序列化 对象序列化的目标是将对象保存到磁盘中 或允许在网络中直接传输对象 对象序列化机制允许把内存中的 java 对象转换成为与平台无关的二进制流 从而允许把这种二进制流持久保存到磁盘上 实现对象序列化 该类实现接口 seri