文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java序列化与反序列化怎么应用

2023-07-05 20:12

关注

这篇“Java序列化与反序列化怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java序列化与反序列化怎么应用”文章吧。

Java 序列化与反序列化

Java序列化把一个对象Java Object变为一个二进制字节序列byte[]

Java反序列化就是把一个二进制字节序列byte[] 变为Java对象Java Object

序列化API

ObjectOutputStream

字节输出流对象,将对象的输出流写到文件中(结合FileOutputStream使用)

实例:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));或FileOutputStream fout = new FileOutputStream("1.txt");ObjectOutputStream out = new ObjectOutputStream(fout);

此外ObjectOutputStream还提供了writeObject()方法来序列化一个对象,并将它发送到输出流。

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));out.writeObject(new Test("Sentiment",10));        //对Test类中的构造方法进行传参

ObjectInputStream

字节输入流对象,将文件中的二进制字节序列进行反序列化操作(结合FileInputStream)

实例:

ObjectInputStream in = new ObjectInputStream(new FileInputStream("1.txt"));或FileInputStream fin = new FileInputStream("1.txt");ObjectInputStream oin = new ObjectInputStream(fin);

此外ObjectInputStream还提供readObject()方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,需要将它转换成合适的数据类型。

ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));Test o = (Test)In.readObject();System.out.println(o);        //读取后输出实例理解

实例理解

Test.java(类想要进行序列化操作,必须实现Serializable接口继承)

package Sentiment.unserialize.demo01;import java.io.Serializable;public class Test implements Serializable {    private String name;    private int age;    public Test() {    }    public Test(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';    }}

Serializable.java

package Sentiment.unserialize.demo01;import java.io.*;public class Serializable {    public static void main(String[] args) throws IOException {        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));        out.writeObject(new Test("Sentiment",10));        out.close();    }}

 UnSerializable.java

package Sentiment.unserialize.demo01;import java.io.FileInputStream;import java.io.IOException;import java.io.ObjectInputStream;public class UnSerializable {    public static void main(String[] args) throws IOException, ClassNotFoundException {        ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));        Test o = (Test)In.readObject();        System.out.println(o);    }}

运行Serializable.java后便得到二进制字节码文件内容

Java序列化与反序列化怎么应用

此时在运行UnSerializable.java便得到了二进制字节码反序列化后的内容

Java序列化与反序列化怎么应用

serialVersionUID

实例理解

在Test.java中定义serialVersionUID 其值为1

package Sentiment.unserialize.demo01;import java.io.Serializable;public class Test implements Serializable {    public static final long serialVersionUID = 1L;   //定义serialVersionUID     private  String name;    private  int age;    public Test() {    }    public Test(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';    }}

此时运行Serializable.java进行序列化操作

运行完毕后将serialVersionUID的值定义为2—>public static final long serialVersionUID = 2L;,在运行UnSerializable.java会报错

Java序列化与反序列化怎么应用

Transient (瞬态变量)

Transient( 瞬态变量 )是一个 Java 关键词 , 它用于标记类的成员变量在持久化到字节流时不要被序列化 ; 在通过网络套接字流传输字节流时 , transient 关键词标记的成员变量不会被序列化 。此为被static修饰的静态变量也不参与序列化操作。

实例理解

将Test.java中的nameage变量前分别加上transientstatic

package Sentiment.unserialize.demo01;import java.io.Serializable;public class Test implements Serializable {    public static final long serialVersionUID = 1L;  //定义serialVersionUID     private transient String name;                     //加上transient    private static int age;                             //加上static    public Test() {    }    public Test(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';    }}

此时在执行Serializable.java和UnSerializable.java,输出结果:Sentiment—>null,10—>0

Java序列化与反序列化怎么应用

readObject()方法重写

官方允许用户在被序列化的类中重写 readObject() 方法 , 重写后的方法将负责在反序列化时重构当前类对象 . 用户只需要在重写的 readObject() 方法中实现 defaultReadObject() 方法 , 就可以确保反序列化过程正常执行 .

实例理解

实现 defaultReadObject() 方法调用,并在Test类中重写该方法,在进行序列化和反序列化操作即可执行命令

private void readObject(java.io.ObjectInputStream a) throws IOException, ClassNotFoundException{    a.defaultReadObject();    Runtime.getRuntime().exec("calc.exe");}

Java序列化与反序列化怎么应用

以上就是关于“Java序列化与反序列化怎么应用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯