对象序列化 --《JAVA编程思想》85

常见的Web漏洞——反序列化漏洞 反序列化简介 序列化:把对象转换为字节序列的过程,即把对象转换为可以存储或传输的数据的过程。例如将内存中的对象转换为二进制数据流或文件,在网络传输过程中,可以是字节或是XML等格式。 反序列化:把字节序列恢复为对象的过程,即把可以存储或传输的数据转换为对象的过程。例如将二进制数据流或文件加载到内存中还原为对象。 反序列化漏洞首次出现在2015。虽然漏洞较新,但利用十分热门。主要原因是对用户可控制的数据进行反序列化时,攻击者能够操纵序列化的对象,从而将精心构造的恶意数据传递到应用程序代码中 阅读详情

当创建对象时,只要你需要,它就会一直存在,但当程序终止时,创建的对象也会不复存在。

假设我们想在程序不运行的情况下,也能保存对象的信息,这时可以通过 JAVA 的对象序列化将对象进行持久化保存(虽然可以通过写入文件或者数据库达到相同的效果,但任何实现方式都有适合它自己的场景,技多不压身)。

序列化的对象必须实现 Serializable 接口,它会转换成字节序列,并能够将这个字节序列完全恢复为原来的对象,这一过程可以通过网络运行,能弥补不同操作系统之间的差异,即在 windows 系统创建的对象进行序列化后,发送至 unix 机器进行反序列化还原出原本的对象。

要序列化一个对象,要创建 OutputStream 对象,然后调用 writeObject(Object obj) 即可将对象序列化;要反序列化,则需要通过创建 ObjectInputStream ,调用 readObject() ,会返回一个 Object 的引用,我们需要将其强制向下转型才能正常使用,需要注意的时,写入对象的顺序和读取的顺序需保持一致。

序列化不仅仅保存了对象自身的基本信息,还保存了每个引用,每个引用对象中的引用也同样被保存下来,依次类推,最终形成了整个“对象网”。

下面我们通过一个例子,来巩固序列化的基础知识点,创建一个 Worm 对象,它包含了一个 Data 类型的数组,还有一个指向下一个 Worm 对象的引用。

public class Data implements Serializable {

    private int n;

    public Data(int n) {
        this.n = n;
    }

    @Override
    public String toString() {
        return Integer.toString(n);
    }

}
public class Worm implements Serializable {

    private static Random rand = new Random(47);

    private Data[] d = {
            new Data(rand.nextInt(10)),
            new Data(rand.nextInt(10)),
            new Data(rand.nextInt(10))
    };

    //下一个Worm的引用
    private Worm next;

    private char c;

    /**
     * @param i 构造Worm的长度
     * @param c 存储的字符
     */
    public Worm(int i, char c) {
        System.out.println("Worm construction: " + i);
        this.c = c;
        //下一个构造的Worm长度-1,字符+1
        if (--i > 0) {
            next = new Worm(i, (char) (c + 1));
        }
    }


    @Override
    public String toString() {
        StringBuilder result = new StringBuilder(":");
        result.append(c);
        result.append("(");
        for (Data data : d) {
            result.append(data);
        }
        result.append(")");
        if (next != null) {
            result.append(next);
        }
        return result.toString();
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Worm w = new Worm(6, 'a');
        System.out.println("w =" + w);
        //通过文件流写入
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("worm.out"));
        out.writeObject("Worm storage \n");
        out.writeObject(w);
        out.close();
        //通过文件流读取
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("worm.out"));
        String s = (String) in.readObject();
        Worm w2 = (Worm) in.readObject();
        System.out.println(s + "w2 = " + w2);
        //通过字节数组流写入
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream out2 = new ObjectOutputStream(bout);
        out2.writeObject("Worm storage \n");
        out2.writeObject(w);
        out2.flush();
        //通过字节数组流读取
        ObjectInputStream in2 = new ObjectInputStream(new ByteArrayInputStream(bout.toByteArray()));
        s = (String) in2.readObject();
        Worm w3 = (Worm) in2.readObject();
        System.out.println(s + "w3 = " + w3);
    }

}
Worm construction: 6
Worm construction: 5
Worm construction: 4
Worm construction: 3
Worm construction: 2
Worm construction: 1
w =:a(853):b(119):c(802):d(788):e(199):f(881)
Worm storage 
w2 = :a(853):b(119):c(802):d(788):e(199):f(881)
Worm storage 
w3 = :a(853):b(119):c(802):d(788):e(199):f(881)

通过上述例子,我们可以发现序列化不仅仅只保留了单个 Worm 本身,它所引用的对象网也同时被保存了下来。我们可以通过文件流(FileOutputStream、FileInputStream)和字节数组(ByteArrayOutputStream、ByteArrayInputStream)流来进行序列化和反序列化(进行反序列化时,要保证虚拟机能找到对应的.class文件)。


本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

vue3+SuperMap iClient3D for Cesium实现可视域分析功能 基于Vue3框架及SuperMap iClient3D for Cesium提供的ViewShed3D类实现场景动态可视域分析 阅读详情

相关推荐

TSMaster实战:手把手教你用C小程序发送自定义CAN报文(附完整代码)

本文详细解析了如何使用TSMaster的C小程序功能实现自定义CAN报文发送,涵盖环境配置、DBC集成、按键触发等实战技巧。通过完整代码示例和高级调试方法,帮助汽车电子工程师快速掌握TSMaster在CAN总线通信中的灵活应用,提升开发效率。

weixin_29184371的博客 574

《Java编程思想》学习笔记15——对象序列化

Java的对象序列化是一个轻量级的持久化过程,序列化时,可以将java对象以字节序列形式写入硬盘、数据库或者通过网络传输到另一个JVM等等,反序列化是读取序列化的文件,将其在JVM中还原为java对象的过程。 1.简单的序列化和反序列化: 最简单的序列化是对象实现Serializable序列化接口,这个接口是一个标记接口,不需要实现任何方法。 下面的小例子简单展示java对象序列化和反序列化

Tony Chen的专栏 2518

双模音频解码器设计:USB+蓝牙LDAC平衡输出方案

音频解码器是数字音频系统中实现数模转换的核心组件,其性能直接决定音质保真度与系统延迟。基于高集成SoC的解码方案通过统一时钟域与片内DSP处理,有效抑制Jitter并简化硬件拓扑;结合全平衡模拟输出架构,可显著提升共模抑制比(CMRR)与信噪比(SNR)。该技术路径广泛应用于便携式Hi-Res音频设备、USB-C小尾巴DAC及蓝牙高解析耳机放大器等场景。本文围绕ES9038Q2M双模SoC展开,详解其在LDAC协议支持、UAC2.0兼容性及平衡电流型DAC输出方面的工程实现,为高性能、可量产音频硬件开发提供

weixin_42613018的博客 388

Java编程思想学习笔记4 - 序列化技术

今天来学习下Java序列化和反序列化技术,笔者对《Java编程思想》中的内容,结合网上各位前辈的帖子进行了整理和补充,包括: 序列化概述 Java原生序列化技术 Hessian序列化技术 JSON序列化技术 Java XML序列化技术 笔者将Hession、Json、XML都归为是一种序列化技术(序列化的本质是“轻量级持久化”,而Hession、Json、XML都属于这个范畴,Hessia...

皖南笑笑生的博客 2508

SWMM建模与案例应用

4、排水系统控制规则通过控制功能,可以在模拟进行过程中,通过条件判断,对闸门、水泵、管道、孔口、堰进行控制,实现排水系统实时控制。5、SWMM与其他模型对比分析分析:STORM、MOUSE、Info Works、SUSTAIN、SWC。1、模型初始设置主要参数:雨量计、汇水区、节点、出水口、管渠、分流器、蓄水池等参数前缀的设置。2、气象数据设置温度、蒸发、风速、融雪、面积亏损、气候调整、雨量计。1、多软件数据交互:CAD、Arcgis、SWMM。(1)节点、管段、水泵、孔口、堰、雨水口和街道。

m0_74575633的博客 3417

Upload Symbols Failed:The archive did not include a dSYM for the LiveKitWebRTC.framework with the UU

你需要从源码构建 LiveKitWebRTC,而不是使用 CocoaPods 安装的预编译 .xcframework。Step 2: 修改 Podfile 使用本地路径引用(不是从源下载的 xcframework)方法 :强制从源码构建 LiveKitWebRTC.framework(推荐)这样它就会编译 WebRTC 并带上正确 UUID 的 dSYM。替换路径为你 clone 下来的 LiveKit 源码位置。Step 1: 克隆源码仓库。

baidu_40537062的博客 2135

java编程思想 序列化

import java.io.*; public class Ans { public static void main(String[] args) throws IOException, ClassNotFoundException { //test0(); //test1(); //test2(); //test3(...

qq_16899143的博客 205

DELPHI11 利用Android手机实现条码扫描功能

好了,整个过程全部结束,当然这只是最简单的例子,只是演示一下如何识别条码,更多的条码处理功能,比如优化,提速等需要在后面继续。安装过程中所有提示框全部按OK就可以,直到提示安装成功,那么ZXing库就成功完成了安装。点击红框标识的文件夹图标,将下载的ZXing库文件路径加入进来后,点ADD。第三步:选择下载的ZXing库路径,并按Ctrl + A进行全选,并导入。至此为止,我们的库才算是全部安装完成,可以在DELPHI 中正常引用了。2.打开相机,识别条码,并将条码内容显示在MEMO1中。

1529

38.JAVA编程思想——JAVA IO 对象序列化

38.JAVA编程思想——JAVA IO 对象序列化 Java 1.1 增添了一种有趣的特性,名为“对象序列化”(Object Serialization)。它面向那些实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在Windows机器上创建一个对象,对其序

badman250的专栏 3万+

保姆级教程:用CANoe手把手复现ECU刷写全流程(含BootLoader三阶段详解)

本文提供了一份详细的CANoe ECU刷写实战指南,涵盖BootLoader三阶段的深度解析。从实验环境搭建到预编程、主编程及后编程阶段,逐步讲解ECU刷写的关键步骤和隐藏逻辑,特别强调UDS诊断和CAN通信的精确控制,帮助开发者掌握ECU刷写的核心技术。

weixin_29234423的博客 529

国社科“选题设计论证”部分不再难!用AI快速梳理五大核心板块,轻松撰写出高质量的基金申报书(附AI提示词)

七哥给大家推荐的高校都在用的AI平台——高级学术版专业应用平台,集成了ChatGPT、Claude、Gemini、Grok等Al大模型的PLUS版本平台,包括 ChatGPT-5、4o、o3、4.1、4.5、Gemini 2.5 Pro、Claude 3.7、Claude 4、DeepSeek 满血版、Grok 3 、Grok 4等原生线路,还有国际主流的GPTs学术应用,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。

智能AI让学术科研更容易 930

第85项:其他序列化优先于Java序列化

  当序列化在1997年被添加到Java时,它被认为有点风险的。该方法已经在一种研究语言(Modula-3)中尝试过,但在生产中的语言从未用过。虽然程序猿承诺在分布式对象上付出点努力得到的成果是很有吸引力的,代价是构造函数是不可见的而且它的API和实现之间的界限很模糊,可能存在正确性、性能、安全性和维护方面的问题。支持者认为这些好处【前面的成果】超过了风险,但历史已经证明并不是这样的。   本书前...

Coloured_Glaze的博客 409

论文阅读-Whisper语音识别(OpenAI)

Whisper 是一个自动语音识别(ASR,Automatic Speech Recognition)系统,OpenAI 通过从网络上收集了 68 万小时的多语言,其中11万小时覆盖96 种语言,12万小时的语言标号为英语,用多任务(multitask)监督数据对 Whisper 进行了训练。

一位不是很硕的鉴伪方向硕士 6366

反序列化对象列表发生异常_谈谈 Java 对象序列化与反序列化。

↑ 点击上面 “时代Java”关注我们,关注新技术,学习新知识!节选自《Java 精简入门教程》进入下面链接或点击文章末尾的 “阅读原文” 查看全部教程https://nowjava.com/book/java-simplify什么是对象序列化?在 序列化 过程中,会以一种特殊的二进制格式存储一个对象及其元数据(比如对象的类名称及其属性名称)的状态。将对象存储为此格式 — 序列化 它 —...

weixin_39992417的博客 246

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【笔记85】优先选择 Java 序列化的替代方案

  当序列化在 1997 年添加到 Java 中时,它被认为有一定的风险。序列化的一个根本问题是它的可攻击范围太大,且难以保护,而且问题还在不断增多:通过调用 ObjectInputStream 上的 readObject 方法反序列化对象图。这个方法本质上是一个神奇的构造函数,可以用来实例化类路径上几乎任何类型的对象,只要该类型实现 Serializable 接口。在反序列化字节流的过程中,此方...

u013773608的博客 689

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

php序列化 java对象_将php序列化到数据库的对象饭序列化成java对象

php的对象序列化到数据库中,形如a:3:{i:0;i:1241;i:1;i:4;i:2;i:16;}但是java需要取出这样的对象,转换成java的对象/* PHPSerializer.java** Author: Ma Bingyao * Copyright: CoolCode.CN* Version: 2.1* LastModified: 2006-08-09* This library i...

weixin_39553272的博客 201

Java编程思想:序列化基础部分

1 import java.io.*; 2 import java.util.Date; 3 import java.util.Random; 4 5 public class Test { 6 public static void main(String[] args){ 7 // Worm.test(); 8 // ...

weixin_30633507的博客 69

Java中如何实现高效的对象序列化与反序列化

Java对象序列化是将对象状态转换为字节流的过程,反序列化则是将字节流恢复为对象的过程。| Protostuff | 减少40-60% | 提升80% | 提升85% || Kryo | 减少30-50% | 提升60% | 提升70% || 序列化方式 | 序列化大小 | 序列化时间 | 反序列化时间 |1. transient关键字:标记不需要序列化的字段。| Java原生 | 基准 | 基准 | 基准 |- Java原生序列化:简单场景、开发调试。- Kryo:高性能要求的中间件、缓存系统。

MRhypCVj的博客 428

java 对象序列化原理_Java序列化的机制和原理(讲的很详细也很易懂)

本文讲解了Java序列化的机制和原理。从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法。0000000B: 11,containVersion的值.0x70:TC_NULL,没有超类了。0x49:域类型. 49代表"I",也就是Int..00 0E:域名字长度.63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E:con...

weixin_29603489的博客 290

跨平台序列化+java_ITEM 85: 使用 Java 序列化的替代方案

ITEM 85: PREFER ALTERNATIVES TO JAVA SERIALIZATION1997年将序列化添加到 Java 中时,人们知道它有一定的风险。这种方法曾在研究语言(Model-3)中试用过,但从未在生产语言中试用过。虽然程序员只需付出很少的努力就能实现分布式对象的承诺很吸引人,但其代价是不可见的构造函数和API与实现之间模糊的界限,以及正确性、性能、安全性和维护方面的潜在问...

weixin_32601635的博客 211

java list反序列化_Java 实现序列化和反序列化

1 packagecom.io.homework;23 importjava.io.BufferedInputStream;4 importjava.io.BufferedOutputStream;5 importjava.io.FileInputStream;6 importjava.io.FileNotFoundException;7 importjava.io.FileOutputStrea...

weixin_33242795的博客 1021

85. Java Record 深入解析:构造函数、访问器、序列化与实际应用

Java 的 Record 是一种特殊的类,主要用于存储不可变数据。它自动生成构造函数、toString()、equals() 和 hashCode() 方法,适合用作数据载体。Record 允许自定义构造函数,但必须调用主构造函数(Canonical Constructor),并支持紧凑构造函数(Compact Constructor)进行额外处理。访问器(Accessor)方法可以自定义,以确保数据封装性。Record 支持序列化,只需实现 Serializable 接口,但无法自定义序列化行为。实际应

yaoxin521123的博客 1544

序列化、反序列化原理

一、 基本概念二、为什么需要序列化和反序列化三、实现序列化和反序列化的方式1、JDK类库API2、JSON方式四、面试重点 一、 基本概念 序列化:将Java对象装换成字节序列 对象序列化的最主要的用处就是再传递和保存对象的时候,保存对象的完整性和可传递性.序列化把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中.序列化后的字节流保存了Java对象的状态以及相关描述信息.序列化机制的核心作用就是对象状态的保存与重建. 反序列化:把字节序列转换成Java对象 客户端从文件或者网络上获.

ccccc202的博客 862

java对象 字节数_如何获得表示Java对象的序列化字节数?

小编典典public static int sizeof(Object obj) throws IOException {ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOut...

weixin_34532234的博客 240

带你快速看完9.8分神作《Effective Java》—— 序列化篇(所有RPC框架的基石)

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2021年12月16日 ???? 个人简介:通信工程本硕????、阿里新晋猿同学????。我的故事充满机遇、挑战与翻盘,欢迎关注作者来共饮一杯鸡汤 ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! 豆瓣评分9.8的图书《Effective Java》,是当今世界顶尖高手Josh Bloch的著作,在我之前的文章里我也提到过,编程就像练武,既需要外在的武功招

如切如磋,如琢如磨 6041

Java - 序列化

序列化 概述 Java提供了一种对象序列化的机制,通过该机制,可以将一个对象表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型 序列化:对象转化为字节序列 反序列化:字节序列转化为对象 对于序列化的过程是Java虚拟机(JVM)独立的,因此在一个平台序列化的对象,可以在另一个完全不同的平台反序列化该对象 5 ObjectInputStream类和Obj...

BlessingXRY的博客 342
上一篇: JAVA原生的文件压缩方法 --《JAVA编程思想》84
下一篇: 对象序列化时屏蔽字段 --《JAVA编程思想》86
BaymaxCS
博客等级 码龄9年 61粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaymaxCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值