文章目录

  • 对象序列化是什么
  • 如何让对象可序列化
  • 让对象跑出内存

对象序列化是什么

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原。

序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是JavaEE 平台的基础。

如果让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现Serializable或者Externalizable两个接口之一。否则,会抛出NotSerializableException异常。

凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:

private static final long serialVersionUID;

serialVersionUID用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象进行版本控制,有关各版本反序列化时是否兼容。如果类没有显示定义这个静态常量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID可能发生变化。所以建议进行显式声明。

简言之,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。


如何让对象可序列化

import java.io.Serializable;/*** @Author: Yeman* @Date: 2021-09-27-8:27* @Description:*/class pet implements Serializable { //实现Serializable接口public static final long serialVersionUID = 999794470754667999L; //显示赋值全局变量serialVersionUIDprivate String name;public pet(String name) {this.name = name;}@Overridepublic String toString() {return "pet{" +"name='" + name + '\'' +'}';}
}public class Person implements Serializable { //实现Serializable接口public static final long serialVersionUID = 6849794470754667999L; //显示赋值全局变量serialVersionUIDprivate String name;private int age;private pet pet;public Person(String name, int age, pet pet) {this.name = name;this.age = age;this.pet = pet;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", pet=" + pet +'}';}
}

让对象跑出内存

通过对象流ObjectInputStreamOjbectOutputSteam

序列化:用ObjectOutputStream类保存基本类型数据或对象的机制,将内存中的对象写入磁盘或者进行网络传输。

反序列化:用ObjectInputStream类读取基本类型数据或对象的机制,将磁盘或者进行网络传输中的序列化对象读过来。

ObjectOutputStreamObjectInputStream不能序列化statictransient修饰的成员变量。

流的相关知识可以见《IO流相关知识点》。

序列化(ObjectOutputStream):

import java.io.*;/*** @Author: Yeman* @Date: 2021-09-26-20:13* @Description:*/
public class Test {public static void main(String[] args) {ObjectOutputStream oos = null;try {oos = new ObjectOutputStream(new FileOutputStream("IO\\test.txt"));oos.writeUTF(new String("你好世界!"));oos.flush();oos.writeObject(new Person("Lily",20,new pet("Xinxin")));oos.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (oos != null) oos.close();} catch (IOException e) {e.printStackTrace();}}}
}

反序列化(ObjectInputStream):

import java.io.*;/*** @Author: Yeman* @Date: 2021-09-26-20:13* @Description:*/
public class Test {public static void main(String[] args) {ObjectInputStream ois = null;try {ois = new ObjectInputStream(new FileInputStream("IO\\test.txt"));String s = ois.readUTF();Person o = (Person) ois.readObject();System.out.println(o.toString());} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} finally {if (ois != null) {try {ois.close();} catch (IOException e) {e.printStackTrace();}}}}
}

让你的对象跑出内存,写入到磁盘或者进行网络传输,一文掌握Java对象序列化相关推荐

  1. ISerializable与BinaryFormatter配合,实现将对象序列化成stream,可以保存或网络传输与反序列化

    C#中ISerializable与BinaryFormatter配合,可以实现将对象序列化成stream,进而可以保存或网络传输以及进行反序列化. (注意: 这是一个年代久远了的知识点!) 以下是网上 ...

  2. 计算 java_两种计算Java对象大小的方法(转)

    原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...

  3. 聊聊JVM(三)两种计算Java对象大小的方法

    普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...

  4. 两种计算Java对象大小的方法

    之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...

  5. 关于 Java 对象序列化您不知道的 5 件事

    数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...

  6. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

  7. 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...

  8. python里面的类和对象_Python中类和对象在内存中是如何保存?

    类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...

  9. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

最新文章

  1. Linux与云计算——第二阶段Linux服务器架设 第八章:FTP服务器架设—安装配置FTP服务和客户端配置...
  2. HQL的使用和limit的替代
  3. 8. An Introduction to MCMC for Machine Learning (3)
  4. TIOBE 6月编程语言榜单:C语言继续占据第一
  5. 5个学习Linux命令站点推荐
  6. MXNet.gluon——图像I/O
  7. mysql 报错1042_mysql安装中 starting sever报错1042怎么破啊??求助大佬
  8. 很吊炸天的Xcode插件,你想要的这都有
  9. 转载:数据库索引的底层原理
  10. eclipse左边工程列表不见了,怎么调出来
  11. 《基于多支持向量机综合的电力系统暂态稳定评估》总结
  12. threejs写的模仿微信跳一跳游戏
  13. 欧阳娜娜从阿里跳槽网易:阿里P8堪称教科书级别的面试现场!最后一个问题亮了...
  14. 为什么国外程序员爱用Mac?
  15. 3dmax给模型添加渐变背景有哪些方法
  16. Multisim基础 发光二极管 添加元件的位置
  17. 进阶之路(故事未完待续)
  18. 还没新上市华为鸿蒙os,搭载华为操作系统的新机或年内上市 华为自研操作系统是鸿蒙还是OS?...
  19. 三井住友加入R3 Marco Polo区块链网络
  20. 2019年天梯赛-全国总决赛-L2-032 彩虹瓶 (25 分)

热门文章

  1. 使用Xtend构建Vaadin UI
  2. 公开调用私有Java方法?
  3. pae扩展内存 linux,浅析linux内核内存管理之PAE
  4. Linux 系统启动流程图/系统初始化流程图
  5. c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...
  6. 头条号个人中心登录_头条号平台上线「插入小程序」功能
  7. 修改linux资源限制参数命令,linux passwd命令参数及用法详解--linux修改用户密码命令...
  8. html按钮冻结,Vue js按钮冻结dom
  9. python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度
  10. 可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动