示例1:

import java.io.*;class UserInfo implements Serializable{private static final long serialVersionUID = -4078405042146324828L;
}public class Test {public static void main(String[] args) {try {ObjectOutput out = new ObjectOutputStream(new FileOutputStream("user_info.ser"));UserInfo userInfo = new UserInfo();//将一个对象两次写入文件out.writeObject(userInfo);out.flush();System.out.println(new File("user_info.ser").length());out.writeObject(userInfo);out.flush();System.out.println(new File("user_info.ser").length());out.close();ObjectInput in = new ObjectInputStream(new FileInputStream("user_info.ser"));// 判断两个引用是否为同一个对象System.out.println((UserInfo) in.readObject() == (UserInfo) in.readObject());in.close();} catch (Exception e) {e.printStackTrace();}}
}

描述:同一对象两次写入文件,输出每次写入后文件大小;从文件中反序列化出两个对象,比较两个对象是否为同一对象,运行结果如下:

一般的思维是,两次写入对象,文件大小会变为两倍的大小,事实是第二次写入对象时文件只增加了 5 字节,为什么?Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,上面增加的 5 字节的存储空间就是新增引用和一些控制信息的空间。反序列化时,恢复引用关系,两次反序列化指向唯一的对象,故输出 true。

示例2:

import java.io.*;class UserInfo implements Serializable{public int age;private static final long serialVersionUID = -4078405042146324828L;
}public class Test{public static void main(String[] args) {try {ObjectOutput out = new ObjectOutputStream(new FileOutputStream("user_info.ser"));UserInfo userInfo = new UserInfo();userInfo.age = 1;out.writeObject(userInfo);out.flush();userInfo.age = 100;out.writeObject(userInfo);out.flush();out.close();ObjectInput in = new ObjectInputStream(new FileInputStream("user_info.ser"));userInfo = (UserInfo)in.readObject();System.out.println(userInfo.age);userInfo = (UserInfo)in.readObject();System.out.println(userInfo.age);in.close();} catch (Exception e) {e.printStackTrace();}}
}

描述:同一个对象序列化两次,第二次序列化前修改对象属性值;从序列化文件中依次读出两个对象并输出两个对象的属性值,运行结果如下:

为什么两个输出的都是 1?第一次写入对象以后,第二次再试图写入时,虚拟机根据引用关系已经知道有一个相同对象已经写入文件,因此第二次写入只存储一份引用,即第二次反序列化时得到的依然是第一次序列化的对象,使用一个文件多次 writeObject 需要特别注意这个问题。

序列化和反序列化(四)——序列化存储规则相关推荐

  1. 【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )

    文章目录 一.导入依赖库 二.构造 JavaBean 三.fastjson 序列化与反序列化 四.gson 序列化与反序列化 五.完整代码 1.主界面代码 2.JSON 测试代码 3.执行结果 六.参 ...

  2. 序列化与反序列化_序列化和反序列化JAVA成长之路

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...

  3. java序列化和反序列化以及序列化ID的作用分析

     java序列化和反序列化 一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一 ...

  4. 序列化和反序列化_PHP序列化和反序列化

    序列化 序列化格式 在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构. 序列化函数原型如下: string serialize ( mixed $value ) 先看下面 ...

  5. mysql序列化字段反序列化_序列化serialize()与反序列化unserialize()的实例

    在写序列化serialize与反序列化unserialize()时,我们先来看看: serialize - 产生一个可存储的值的表示 描述 string serialize ( mixed $valu ...

  6. 序列化与反序列化存储、updatepanel

    序列化与反序列化: 主要用于存储对象状态为另一种通用格式,比如存储为二进制.xml.json等等,把对象转换成这种格式就叫序列化,而反序列化通常是从这种格式转换回来. 第一次用序列化和反序列化,存储的 ...

  7. JavaSE——IO(下)(Properties类、序列化与反序列化)

    第3节 IO(下) 一..properties文件与Properties类 1.1 .properties文件介绍 .properties文件一种属性文件,以键值对 的格式存储内容,在Java中可以使 ...

  8. Java之序列化和反序列化

    字符流和字节流,他们的操作对象是:字节(二进制),字符 序列化和反序列化的操作主体对象是:对象和二进制 什么是序列化和反序列化? 序列化:将对象转换成二进制 反序列化:从二进制中将二进制转换成对象(类 ...

  9. 【Java-IO】File、搜索删除剪切、字符集、字符编码、字节流、将内存中的数据写入文件、字符流、缓冲流、Scanner、格式化输出、数据流、对象流、序列化与反序列化、Files工具类

    IO 文章目录 IO 简介 File 分隔符.大小写 常用方法 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 字节 ...

  10. OWASP TOP 10(六)反序列化漏洞(序列化和反序列化、漏洞原理、PHP中的序列化和反序列化、魔术方法、Typecho_v1.0中的反序列化漏洞)

    文章目录 反序列化漏洞 一.概述 1. 序列化和反序列化 2. 序列化的目的 二.PHP中的序列化与反序列化 1. 概述 2. 示例序列化与反序列化 3. 反序列化漏洞 - PHP中的魔术方法 - T ...

最新文章

  1. Linux初步——常用简单命令
  2. springboot + rabbitmq 整合示例
  3. oracle update 数据库恢复,ORACLE update 操作内部原理
  4. Mycat对于导入和扩容迁移性能压测
  5. 读芯片信息出错3_十分钟看懂串口打印信息(1)
  6. JEECG Excel 实体类
  7. 2 PP配置-一般设置-为工厂分配工厂日历
  8. Json转换利器Gson-Gson注解和GsonBuilder
  9. 1134 Vertex Cover
  10. 为什么需要消息队列(MQ)
  11. python更换证件照背景
  12. python解析钩针图解到markdown文件/requests/BeautifulSoup
  13. V部落博客管理平台开源啦! Vue+SpringBoot强强联合! 1
  14. 迷你世界箱子里物品无限取
  15. 网络DNS域名转换成IP地址
  16. 阿里云配置https,配置SSL证书
  17. Vue商城项目(篇5)购物车页面
  18. Android Studio 打包配置设置V1签名
  19. 新零售的未来-智能电子价签
  20. SpringSecurity密码加密存储

热门文章

  1. OC--Protocol 协议
  2. android LocalActivityManager说明
  3. WPF程序,运行时,结束时,要运行的操作(自动保存,检查单程序)
  4. 微信小程序中页面间跳转传参方式
  5. 有关C#中的引用类型的内存问题
  6. vmware下安装mac os虚拟机问题,最后还是最终攻克了被一个小失误给陷害了
  7. 虚幻开放日2017ppt
  8. Zorin OS:Windows用户无痛转移Linux
  9. 第41课 WEB代理、Haproxy 配置详解及Haproxy ACL使用
  10. KVM虚拟化实践-老男孩架构师课程教案笔记分享