让你的对象跑出内存,写入到磁盘或者进行网络传输,一文掌握Java对象序列化
文章目录
- 对象序列化是什么
- 如何让对象可序列化
- 让对象跑出内存
对象序列化是什么
对象序列化机制允许把内存中的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 +'}';}
}
让对象跑出内存
通过对象流ObjectInputStream
和OjbectOutputSteam
。
序列化:用ObjectOutputStream
类保存基本类型数据或对象的机制,将内存中的对象写入磁盘或者进行网络传输。
反序列化:用ObjectInputStream
类读取基本类型数据或对象的机制,将磁盘或者进行网络传输中的序列化对象读过来。
ObjectOutputStream
和ObjectInputStream
不能序列化static
和transient
修饰的成员变量。
流的相关知识可以见《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对象序列化相关推荐
- ISerializable与BinaryFormatter配合,实现将对象序列化成stream,可以保存或网络传输与反序列化
C#中ISerializable与BinaryFormatter配合,可以实现将对象序列化成stream,进而可以保存或网络传输以及进行反序列化. (注意: 这是一个年代久远了的知识点!) 以下是网上 ...
- 计算 java_两种计算Java对象大小的方法(转)
原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...
- 聊聊JVM(三)两种计算Java对象大小的方法
普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...
- 两种计算Java对象大小的方法
之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...
- 关于 Java 对象序列化您不知道的 5 件事
数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...
- 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用
重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...
- 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用
大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...
- python里面的类和对象_Python中类和对象在内存中是如何保存?
类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...
- JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具
堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...
最新文章
- Linux与云计算——第二阶段Linux服务器架设 第八章:FTP服务器架设—安装配置FTP服务和客户端配置...
- HQL的使用和limit的替代
- 8. An Introduction to MCMC for Machine Learning (3)
- TIOBE 6月编程语言榜单:C语言继续占据第一
- 5个学习Linux命令站点推荐
- MXNet.gluon——图像I/O
- mysql 报错1042_mysql安装中 starting sever报错1042怎么破啊??求助大佬
- 很吊炸天的Xcode插件,你想要的这都有
- 转载:数据库索引的底层原理
- eclipse左边工程列表不见了,怎么调出来
- 《基于多支持向量机综合的电力系统暂态稳定评估》总结
- threejs写的模仿微信跳一跳游戏
- 欧阳娜娜从阿里跳槽网易:阿里P8堪称教科书级别的面试现场!最后一个问题亮了...
- 为什么国外程序员爱用Mac?
- 3dmax给模型添加渐变背景有哪些方法
- Multisim基础 发光二极管 添加元件的位置
- 进阶之路(故事未完待续)
- 还没新上市华为鸿蒙os,搭载华为操作系统的新机或年内上市 华为自研操作系统是鸿蒙还是OS?...
- 三井住友加入R3 Marco Polo区块链网络
- 2019年天梯赛-全国总决赛-L2-032 彩虹瓶 (25 分)
热门文章
- 使用Xtend构建Vaadin UI
- 公开调用私有Java方法?
- pae扩展内存 linux,浅析linux内核内存管理之PAE
- Linux 系统启动流程图/系统初始化流程图
- c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...
- 头条号个人中心登录_头条号平台上线「插入小程序」功能
- 修改linux资源限制参数命令,linux passwd命令参数及用法详解--linux修改用户密码命令...
- html按钮冻结,Vue js按钮冻结dom
- python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度
- 可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动