【Java】Java序列化和反序列化

人不走空

                                                                      

      🌈个人主页:人不走空      

💖系列专栏:算法专题

⏰诗词歌赋:斯是陋室,惟吾德馨

# Java中的序列化和反序列化

在Java中,序列化是将对象的状态写入字节流的机制。它主要用于Hibernate、RMI、JPA、EJB和JMS技术中。

反序列化是序列化的逆操作,即将字节流转换为对象。序列化和反序列化过程是平台无关的,这意味着您可以在一个平台上对对象进行序列化,在另一个平台上进行反序列化。

为了序列化对象,我们调用ObjectOutputStream类的writeObject()方法,而为了反序列化,则调用ObjectInputStream类的readObject()方法。

我们必须实现Serializable接口才能序列化对象。

# Java序列化的优点

它主要用于在网络上传输对象的状态(即称为marshalling)。

图片

java.io.Serializable接口

Serializable是一个标记接口(没有数据成员和方法)。它用于“标记”Java类,以便这些类的对象可以获得某种能力。Cloneable和Remote也是标记接口。

Serializable接口必须由需要持久化其对象的类实现。

String类和所有包装类默认实现了java.io.Serializable接口。

让我们看下面给出的例子:

Student.java

import java.io.Serializable;  public class Student implements Serializable{   int id;   String name;   public Student(int id, String name) {    this.id = id;    this.name = name;   }  }  

在上面的示例中,Student类实现Serializable接口。现在它的对象可以转换为流。主类的实现显示在下一个代码中。

 

专属福利

👉点击领取:Java资料合集!650G!

ObjectOutputStream类

ObjectOutputStream类用于将基本数据类型和Java对象写入OutputStream。只有支持java.io.Serializable接口的对象才能写入流中。

构造函数

图片

重要方法

MethodDescription

1) public final void writeObject(Object obj) throws IOException {}

它将指定的对象写入 ObjectOutputStream。

2) public void flush() throws IOException {}

它刷新当前输出流。

3) public void close() throws IOException {}

它关闭当前输出流。

ObjectInputStream类

ObjectInputStream反序列化使用ObjectOutputStream编写的对象和基本数据。

构造函数

图片

重要方法

MethodDescription

1) public final Object readObject() throws IOException, ClassNotFoundException{}

它从输入流中读取一个对象。

2) public void close() throws IOException {}

它关闭 ObjectInputStream。.

# Java序列化的例子

在此示例中,我们将从上面代码的Student类序列化对象。 

ObjectOutputStream类的writeObject()方法提供了序列化对象的功能。我们正在将对象的状态保存在名为f.txt的文件中。

Persist.java

 
import java.io.*;    class Persist{     public static void main(String args[]){      try{      //Creating the object      Student s1 =new Student(211,"ravi");      //Creating stream and writing the object      FileOutputStream fout=new FileOutputStream("f.txt");      ObjectOutputStream out=new ObjectOutputStream(fout);      out.writeObject(s1);      out.flush();      //closing the stream      out.close();      System.out.println("success");      }catch(Exception e){System.out.println(e);}     }    }    

输出:

 
success

# Java反序列化的例子

反序列化是从序列化状态重构对象的过程。它是序列化的逆操作。让我们看一个示例,其中我们从反序列化对象中读取数据。

Deserialization是从序列化状态重构对象的过程。它是序列化的逆操作。让我们看一个示例,其中我们从反序列化对象中读取数据。

Depersist.java

 
import java.io.*;  class Depersist{   public static void main(String args[]){    try{    //Creating stream to read the object    ObjectInputStream in=new ObjectInputStream(new FileInputStream("f.txt"));    Student s=(Student)in.readObject();    //printing the data of the serialized object    System.out.println(s.id+" "+s.name);    //closing the stream    in.close();    }catch(Exception e){System.out.println(e);}   }  }  

输出:

 
211 ravi

# Java继承(IS-A关系)的序列化

如果一个类实现了Serializable接口,则所有它的子类也将可序列化。让我们看下面给出的例子:

SerializeISA.java

 
import java.io.Serializable;    class Person implements Serializable{     int id;     String name;     Person(int id, String name) {      this.id = id;      this.name = name;     }    }    class Student extends Person{     String course;     int fee;     public Student(int id, String name, String course, int fee) {      super(id,name);      this.course=course;      this.fee=fee;     }    }    public class SerializeISA  {     public static void main(String args[])   {        try{      //Creating the object      Student s1 =new Student(211,"ravi","Engineering",50000);      //Creating stream and writing the object      FileOutputStream fout=new FileOutputStream("f.txt");      ObjectOutputStream out=new ObjectOutputStream(fout);      out.writeObject(s1);      out.flush();      //closing the stream      out.close();      System.out.println("success");      }catch(Exception e){System.out.println(e);}      try{      //Creating stream to read the object      ObjectInputStream in=new ObjectInputStream(new FileInputStream("f.txt"));      Student s=(Student)in.readObject();      //printing the data of the serialized object      System.out.println(s.id+" "+s.name+" "+s.course+" "+s.fee);      //closing the stream      in.close();      }catch(Exception e){System.out.println(e);}     }    }  

输出:

 
success211 ravi Engineering 50000

SerializeISA类已序列化扩展了Person类的Student类对象,而Person类是可序列化的。父类属性继承到子类,因此如果父类是可序列化的,则子类也将是可序列化的。

# Java聚合(HAS-A关系)序列化

如果一个类引用另一个类,则所有引用必须是Serializable,否则将不执行序列化过程。在这种情况下,在运行时会抛出NotSerializableException。

Address.java

 
class Address{     String addressLine,city,state;     public Address(String addressLine, String city, String state) {      this.addressLine=addressLine;      this.city=city;      this.state=state;     }    }    

Student.java

 
import java.io.Serializable;  public class Student implements Serializable{   int id;   String name;   Address address;//HAS-A   public Student(int id, String name) {    this.id = id;    this.name = name;   }  }  

由于Address不可序列化,因此无法序列化Student类的实例。

注意:对象中的所有对象都必须是可序列化的。

# Java序列化中的静态数据成员

如果一个类中有任何静态数据成员,它将不被序列化,因为静态是类的一部分而不是对象。

Employee.java

 
class Employee implements Serializable{   int id;   String name;   static String company="SSS IT Pvt Ltd";//it won't be serialized   public Student(int id, String name) {    this.id = id;    this.name = name;   }  }  

# Java序列化数组或集合

规则:在数组或集合的情况下,数组或集合的所有对象必须是可序列化的。如果任何对象不可序列化,则序列化将失败。

Java中的Externalizable

Externalizable接口提供了以压缩格式将对象状态写入字节流的功能。它不是标记接口。

Externalizable接口提供两个方法:

  • public void writeExternal(ObjectOutput out) throws IOException

  • public void readExternal(ObjectInput in) throws IOException

Java暂时关键字

如果您不想序列化类的任何数据成员,可以将其标记为瞬态。

Employee.java

 
class Employee implements Serializable{   transient int id;   String name;   public Student(int id, String name) {    this.id = id;    this.name = name;   }  }  

现在,id将不会序列化,因此在序列化之后反序列化对象时,您将不会得到id的值。它始终返回默认值。在这种情况下,它将返回0,因为id的数据类型是整数。

访问下一页获取更多详细信息。

SerialVersionUID

运行时序列化过程将序列化类与每个可序列化类关联一个标识符,称为SerialVersionUID。它用于验证序列化对象的发送方和接收方。发送方和接收方必须相同。为验证它,使用SerialVersionUID。发送方和接收方必须具有相同的SerialVersionUID,否则在反序列化对象时将抛出InvalidClassException。我们还可以在Serializable类中声明自己的SerialVersionUID。

要这样做,您需要创建一个SerialVersionUID字段并为其分配一个值。它必须是长类型,并且带有静态和最终修饰符。建议在类中明确声明serialVersionUID字段,并将其私有化。例如:

 
private static final long serialVersionUID=1L;  

现在,可序列化类将如下所示:

Employee.java

 
import java.io.Serializable;    class Employee implements Serializable{     private static final long serialVersionUID=1L;     int id;     String name;     public Student(int id, String name) {      this.id = id;      this.name = name;     }    }    
 

图片


作者其他作品:

【Java】Spring循环依赖:原因与解决方法

OpenAI Sora来了,视频生成领域的GPT-4时代来了

[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读

【Java】深入理解Java中的static关键字

[Java·算法·简单] LeetCode 28. 找出字a符串中第一个匹配项的下标 详细解读

了解 Java 中的 AtomicInteger 类

算法题 — 整数转二进制,查找其中1的数量

深入理解MySQL事务特性:保证数据完整性与一致性

Java企业应用软件系统架构演变史

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【活动】搜维尔科技携Xsens邀您出席世界人工智能大会

展会介绍 由外交部、国家发展改革委、教育部、科技部、工业和信息化部、国家网信办、中国科学院、中国科协和上海市政府共同主办的世界人工智能大会(WAIC),将于7月4日-7日在上海举行。围绕“以共商促共享 以善治促善智”主题,打造…

VNode是什么?

什么是VNode VNode的全称是Virtual Node,也就是虚拟节点.它是指一个抽象的节点对象,用于描述真实DOM中的元素。在前端框架中,通过操作VNode来实现虚拟DOM,从而提高性能。 VNode的本质 本质上是JavaScript对象,这个对象就是更加轻量级的对DOM…

越有水平的领导,越擅长用这3个字来管人,怪不得执行力强

越有水平的领导,越擅长用这3个字来管人,怪不得执行力强 第一个字:“实” 要想提高执行力,必须发扬务实、实干、刻苦勤勉的工作精神。纸上谈兵,夸夸其谈的事情少做,多行动,少说话。 沉浸在表面…

打破数据分析壁垒:SPSS复习必备(十一)

一、方差分析 方差分析的应用条件如下: (1)独立,各组数据相互独立,互不相关; (2)正态:即各组数据符合正态分布; (3)方差齐性&…

多线程思维导图

多线程 线程是一个程序内部的一条执行流程 多线程的好处————消息通信,网页浏览等等 多线程是指从软硬件上实现多条执行流程的技术 并发和并行同时执行 多线程的创建 Java.Long包下的Thread类 定义一个子类…

突然断供中国!OpenAI变CloseAI,用户连夜搬家

ChatGPT狂飙160天,世界已经不是之前的样子。 更多资源欢迎关注 OpenAI,这把变成CloseAI了。 6月25日早上,有中国开发者表示收到了来自OpenAI的“警告信”:将采取额外措施停止其不支持的地区的API(应用接口&#xff09…

我对AI赋能的未来畅想

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

【Java Web】XML格式文件

目录 一、XML是什么 二、常见配置文件类型 *.properties类型: *.xml类型: 三、DOM4J读取xml配置文件 3.1 DOM4J的使用步骤 3.2 DOM4J的API介绍 一、XML是什么 XML即可扩展的标记语言,由标记语言可知其基本语法和HTML一样都是由标签构成的文件…

springboot vue 开源 会员收银系统 (8) 收银台、开卡结算及订单的优化升级

前言 完整版演示 开发版演示 在之前的开发进程中,我们基本搭建了收银台的基础。这次着重梳理一下收银台相关功能的开发及优化情况。 1.会员查询与开卡 收银台新增加了会员筛选功能 并且会员和会员卡是一对多的关系 理论可以开无数张卡 默认选择一张卡 会员卡选择…

stm32学习笔记---TIM输出比较(代码部分)PWM驱动LED呼吸灯/舵机/直流电机

目录 第一个工程:PWM驱动LED呼吸灯 PWM.c 初始化PWM步骤 TIM的库函数 TIM_OCStructInit TIM_CtrlPWMOutputs TIM_CCxCmd和TIM_CCxNCmd TIM_SelectOCxM 四个单独更改CCR寄存器值的函数 四个初始化定时器的通道的函数 给结构体一次性都赋初始值的函数 如何…

从写下第1个脚本到年薪40W,我的测试开发心路历程!

对于任何职业来说,薪资始终都会是众多追求的重要部分。前几年测试行业还是风口,但是随着不断新鲜血液的加入,再加上就业大环境不好,企业也都在“降本增效”。目前内卷也是越来越激烈。不得不承认当下的现状,已经不仅仅…

引导过程与服务器控制

一、引导过程 1.开机自检 服务器主机开机以后,将根据主板 BIOS 中的设置对 CPU(Central Processing Unit, 中央处理器)、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移 交系统控制权&#xff0c…

AI X HI:塑造数智时代的人类镜像,网易这场分享不能错过!

2001 年,网易正式成立在线游戏事业部。从那以后,网易孵化了许多出圈的精品游戏,跻身成为全球七大游戏公司之一。这些游戏产品之所以能够广受玩家好评,并保持常青,一方面源于十年磨一剑的精良品质,另一方面则…

[油猴脚本] Image To Ascii 快速转换审计网站图片中敏感信息插件

项目地址:https://github.com/MartinxMax/ImageToAscii 导入 将ImagetoAscii.user.js导入油猴 进行按照 访问网站分析图片 当鼠标靠近图片时会出现分析按钮 通过审查图片信息,我们可以快速发现这张图片存在PHP代码。 当然在渗透测试中,你可以快速查看上传的图片木马中PHP代码…

PS系统教程30

图层蒙版组合使用 案例介绍 全选背景图-复制背景图粘贴背景图CtrlI反选背景色填充黑色快速选区工具框柱需要素材画笔涂抹白色 步骤截图 1-3 4-5 图层蒙版与渐变工具结合使用 案例2 注意 使用PS的渐变工具覆盖全部的原因可能包括操作不当或设置错误。 操作不当&#xff1…

C++系列-String(三)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” assign 这个接口的目的是用一个新的值代替之前的那个值 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<list> #include&l…

华三交换机的软件版本升级操作

升级操作很常见&#xff0c;掌握方法是关键 实验环境&#xff1a;1台华三S6520-EI交换机&#xff0c;版本从2432P03升级成2432P05。 整体思路&#xff1a; 1.先查验软件版本 2.官网下载对于设备型号的软件版本 3.配置交换机地址使得与电脑进行通信&#xff0c;使用TFTP/FTP工…

Swift 周报 第五十五期

文章目录 前言新闻和社区苹果公司据悉将推出密码管理应用三大指数涨跌不一&#xff0c;苹果重新夺回美股第二大上市公司宝座苹果iOS 18新动向&#xff1a;AI功能强化隐私保护&#xff0c;用户自主选择启用 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言…

微信小程序navigateTo异常(APP-SERVICE-SDK:Unknown URL)

背景 在开发小程序时&#xff0c;可能会用到banner&#xff0c;通过banner跳转至各种子页面。但是因为小程序自身的因素&#xff0c;有些是不允许的&#xff0c;比如通过banner跳转一个http/https链接。如果使用 wx.navigateTo完成跳转时&#xff0c;就会发生异常。 navigate…

第二十八周代码

B3631 单向链表 题目链接 【参考代码】 list的简介及使用 80%通过率 #include <bits/stdc.h> using namespace std;int main() {list<int> list;list.push_back(1);int q;cin>>q;while(q--){int operation;cin>>operation;if(operation 1){int x,…