Java安全基础之Java序列化与反序列化

这篇具有很好参考价值的文章主要介绍了Java安全基础之Java序列化与反序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • ObjectInputStream 和 ObjectOutputStream
  • java.io.Serializable
  • 自定义序列化和反序列化

Java 的序列化(Serialization)是指将对象转换为字节序列的过程,而反序列化(Deserialization)则是将字节序列转换回对象的过程。

序列化和反序列化通常用于在网络上传输对象或者将对象持久化到文件系统中。

Java 提供了 java.io.Serializable 接口来支持对象的序列化和反序列化。如果一个类实现了 Serializable 接口,那么该类的对象就可以被序列化和反序列化。

ObjectInputStream 和 ObjectOutputStream

ObjectInputStream 和 ObjectOutputStream 是 Java 中用于序列化和反序列化对象的类,它们提供了将对象转换为字节流并将字节流转换回对象的功能。

  • ObjectOutputStream:用于将对象序列化为字节流,依赖于 writeObject() 方法。

  • ObjectInputStream:用于从字节流反序列化对象,依赖于 readObject() 方法。

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.ser"))) {
    // 写入对象到文件
    out.writeObject(myObject);
} catch (IOException e) {
    e.printStackTrace();
}

try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.ser"))) {
    // 从文件中读取对象
    MyObject myObject = (MyObject) in.readObject();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

java.io.Serializable

Serializable 这个接口本身并不包含任何方法,它只是一个空接口,其作用是告诉 Java 编译器,这个类的对象可以被序列化成字节流,也可以从字节流中反序列化成对象。

使用文件流进行序列化: 将对象序列化到文件中,使用 FileOutputStream 和 FileInputStream 进行读写操作。

import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        try {
            String obj = "serialization example";

            // 序列化对象到文件
            FileOutputStream fos = new FileOutputStream("object.ser");
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(obj);
            os.close();

            //反序列化对象到文件
            FileInputStream fis = new FileInputStream("object.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            String dobj = (String)ois.readObject();
            System.out.print(dobj);
            ois.close();

        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

使用字节数组进行序列化: 还可以使用 ByteArrayOutputStream 将对象序列化到字节数组中。

import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        try {
            String obj = "serialization example";

            // 序列化对象到字节数组
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(byteArrayOutputStream);
            os.writeObject(obj);
            os.close();

            // 从字节数组反序列化对象
            byte[] byteArray = byteArrayOutputStream.toByteArray();
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
            ObjectInputStream ois = new ObjectInputStream(byteArrayInputStream);
            String dobj = (String) ois.readObject();
            System.out.print(dobj);
            ois.close();

        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

除了可以将对象序列化到文件流和字节数组,还可以将对象序列化到网络流、缓存流等。除了 Java 原生的序列化方式外,还有一些第三方库可以进行对象的序列化,例如 JSON 序列化或者 XML 序列。

自定义序列化和反序列化

在 Java 中,可以通过实现 writeObject() 和 readObject() 方法来自定义序列化和反序列化过程,可以更灵活地控制对象在序列化和反序列化过程中的行为。

  • 自定义序列化:private void writeObject(ObjectOutputStream oos)

  • 自定义反序列化:private void readObject(ObjectInputStream ois)

例如:Person 类实现了 Serializable 接口

class Person implements Serializable {
    private String name;
    private transient int age; // transient 表示该字段不参与序列化

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 自定义序列化方法
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject(); // 默认序列化其他字段
        // 手动序列化 age 字段
        out.writeInt(age);
    }

    // 自定义反序列化方法
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject(); // 默认反序列化其他字段
        // 手动反序列化 age 字段
        age = in.readInt();
    }
}

在待序列化或反序列化的类中定义 readObject 和 writeObject 方法,就来实现了自定义的序列化和反序列化操作。


若有错误,欢迎指正!o( ̄▽ ̄)ブ文章来源地址https://www.toymoban.com/news/detail-855162.html

到了这里,关于Java安全基础之Java序列化与反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter笔记:序列化与反序列化

    Flutter笔记 序列化与反序列化 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/133340592 序列化是一种将复杂数据结构(例如对象、数组、字典等)转换为线性格式或字节流的过程,以便于数据的存储

    2024年02月07日
    浏览(55)
  • 序列化与反序列化读取配置文件

    定义一个连接配置文件类OmCipNetParam 定义一个结构体,传递函数运行结果和运行信息 ​ 使用Newtonsoft.Json进行序列化和反序列化读写配置文件 同理反序列读取配置文件 注意这里需要引入库

    2024年02月08日
    浏览(57)
  • 【计算机网络】序列化与反序列化

    通过打包的方式,将结构体message发送给对方 对方收到后就会报告给上层QQ客户端 结构化的数据 是由 多个 string 构成的 而以前在网络套接字 发送时,都是按照一个字符串的方式来发送和接收的 所以想办法 ,把多个字符串 转化为 一个大\\\"字符串\\\",对方在接收时也是一个长的

    2024年02月10日
    浏览(44)
  • Springboot Jackson 序列化与反序列化配置

    可解决在使用默认反序列化Jackson时,LocalDateTime类型的请求参数反序列化失败的问题

    2024年02月02日
    浏览(43)
  • Leetcode 297. 二叉树的序列化与反序列化

    297. 二叉树的序列化与反序列化

    2024年02月07日
    浏览(40)
  • 深入探究序列化与反序列化:原理、应用和最佳实践

    序列化 (Serialization)是指将对象转化为字节流的过程,以便于存储或通过网络进行传输。 反序列化 (Deserialization)则是将字节流转化为对象的过程,恢复原始对象的状态。 在计算机科学中,序列化和反序列化是常用的数据处理技术,用于在不同系统、不同编程语言之间传

    2024年02月08日
    浏览(43)
  • 【网络编程】协议定制+Json序列化与反序列化

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、序列化与反序列化的概念 二、自定义协议设计一个网络计算器 2.1TCP协议,如何保证接收方收到了完整的报文呢?

    2024年02月06日
    浏览(56)
  • 使用nlohmann json库进行序列化与反序列化

    nlohmann源码仓库:https://github.com/nlohmann/json 使用方式:将其nlohmann文件夹加入,包含其头文件json.hpp即可 demo

    2024年02月10日
    浏览(40)
  • JSON序列化与反序列化NULL值丢失问题

    做项目一般都会有一些特殊的需求,例如保留json中的null值,但是fastjson都会把null值得属性给过滤掉 json序列化保留null值 json反序列化保留null值 使用hutool的Json工具时

    2024年02月15日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包