刚打完蓝桥杯,摆!

核心类:

ObjectOutputStream:IO 类,包含序列化对象的方法,writeObject()

ObjectInputStream:IO 类,包含反序列化对象的方法,readObject()

Serializable ,接口,是一个标志性接口,标识可以在 JVM 中进行序列化,JVM 会为该类自动生成一个序列化版本号。参与序列化与反序列化的类必须实现 Serializable 接口

serialVersionUID,类属性,序列化版本号,用于给 JVM 区别同名类,没有提供版本号,JVM会默认提供序列化版本号

transient,关键字,让某些数据不参与序列化

序列化与反序列化的过程

也就是将 Java 对象对象的状态保存下来存储到文件中的过程就叫做序列化。

将硬盘中保存了 Java 对象状态的字节序列按照编号组装成对象恢复到内存中,这个过程称为反序列化。

serialVersionUID

当类名相同时,JVM 就会通过序列化版本号来区分 Java 类,序列化版本号不同就为不同的类

tips:序列化一个对象时,如果没有指定序列化版本号,后期对该类的源码进行修改并重新编译后,会导致修改前后的序列化版本号不一致,因为 JVM 会提供一个新的序列化版本号给该类对象

此时再用以往的反序列化代码去反序列化该类的对象,就会抛出异常 java.io.InvalidClassException ,所以序列化一个类时最好指定一个序列化版本号,或者永远不修改此类。

定义:

简单写法就是在首行添加

public class Student implements Serializable {private static final Long serialVersionUID = 1122233;
}

序列化/反序列化举例

#student
package student;
import java.io.Serializable;
public class student implements Serializable {private String name;public int age;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';}public student(String name,int age) {this.name = name;this.age = age;}}
#ser
package student;import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class ser {public static void main(String[] args) throws Exception {
student o = new student("xiaoming",12);ObjectOutputStream oss = new ObjectOutputStream((new FileOutputStream("student")));oss.writeObject(o);oss.flush();oss.close();}
}
#unser
package student;
import java.io.FileInputStream;
import java.io.FilterInputStream;
import java.io.ObjectInputStream;
public class unser {public static void main(String[] args) throws Exception {ObjectInputStream s =new ObjectInputStream(new FileInputStream("student"));Object obj = s.readObject();System.out.println(obj);s.close();}
}

transient 关键字

简单来说就是当你不想序列化类中某个某个属性,即可用transient去定义,这样序列化时就略过这个属性了

public class Student implements Serializable {private static final Long serialVersionUID = 1122233;private String name;private transient int age;//在反序列化时就不能会输出该属性,默认恢复成 null 或 0
}

可以看见起作用了,默认输出了null或者0;

注意事项:

说一下自己理解的小节吧:

1.序列化对象要调用ser接口

2.序列化只针对属性,不针对方法

3.最好设置一个序列化号,防止出错

4.同一对象序列化多次,只有第一次序列化为二进制流,以后都只是保存序列化编号,不会重复序列化。

5.序列化对象的引用类型成员变量,也必须是可序列化的,否则,会报错,也就是说只要进行序列化的对象,都要进行ser接口的实现

java反序列化浅探相关推荐

  1. 00005在java结果输出_浅谈Java反序列化漏洞原理(案例未完善后续补充)

    摘要: 0005,这个16进制流基本上也意味者java反序列化的开始:(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果:以上意味着存在Java反序列化,可尝试构造pa ...

  2. Delphi的对象机制浅探[转载]

    Delphi的对象机制浅探 savetime2k@yahoo.com 2004-1-3 前几天开始阅读 VCL 源代码,可是几个基类的继承代码把我看得头大.在大富翁请教了几位仁兄后,我还是对Delph ...

  3. java 反序列化工具 marshalsec改造 加入dubbo-hessian2 exploit

    0x00 前言 1. 描述 官方github描述: Java Unmarshaller Security - Turning your data into code execution "将 ...

  4. java反序列化漏洞的一些gadget

    目录 0x00 URLDNS 0x01 Commons Collections 0x02 RMI的codebase任意代码执行 0x03 JNDI 0x04 LDAP 0x05 JDK7u21 首先说 ...

  5. java 反序列化漏洞 利用思路简介

    目录 序列化的过程 readObject方法 反射链 完成反序列漏洞实践 结论 之前听别人讲解反序列化的漏洞听的晕乎乎的,刚脆就趁着周末研究一下反序列化漏洞,并且搭建实战环境实际操作了一把,明白了之后 ...

  6. java 反序列化漏洞简介

    目录 一.Java的序列化与反序列化 二.对java序列化的理解 三.反序列化的漏洞原理概述 四.关于反射链 一.Java的序列化与反序列化 在这里我们直接自己定义一个类,然后对这个类的对象(一个实例 ...

  7. java 反序列化 ysoserial exploit/JRMPListener 原理剖析

    目录 0 前言 1 payloads/JRMPClient 1.1 Externalizable 1.2 生成payload 1.3 gadget链分析 2 exploit/JRMPListener ...

  8. ysoserial java 反序列化 Groovy1

    ysoserial简介 ysoserial是一款在Github开源的知名java 反序列化利用工具,里面集合了各种java反序列化payload: 由于其中部分payload使用到的低版本JDK中的类 ...

  9. 【关于学习渗透】手把手教你玩转java反序列化cb链

    前言 java反序列化cb链大家应该都玩过,博主当初是通过看shiro无依赖了解到的,最近在重学基础,就手把手一点一点调试一遍.记得11月份自博主反思之后,认为自己渗透的学习深度广度都太差,对漏洞的学 ...

最新文章

  1. 信号与系统期末考试2020春季学期试题准备
  2. cesium 3dtiles 加载本地数据_Meteva笔记:加载本地观测数据
  3. 解耦 多态性 java_java多态
  4. 基于C#局域网语音聊天
  5. 11.MapReduce第1部分
  6. nfs服务器_Kubernetes集群下部署NFS持久存储
  7. Python 3 - 如何下载视图和保存证书
  8. 用极域课堂管理系统软件批量格式化D盘
  9. Java基础问题整理
  10. 超五类网线和超六类网线的区别
  11. github创建代码仓库并上传代码
  12. 通信原理第三章:正弦波加窄带高斯噪声
  13. 拆掉思维里的墙读书笔记
  14. 如何在Oracle数据库中使用dbms_output输出内容
  15. H5 iOS 自动调起软键盘
  16. 执行董事和CEO有什么区别
  17. C# 终本案件、综合执行人、裁判文书爬虫
  18. 2021美赛E题题译+思路+参考资料
  19. 用Python告诉你广州房租现状
  20. 【CODECHEF】Children Trips(分块)

热门文章

  1. Java开源JEE框架
  2. Chap和pap认证
  3. 帝国cms模板如何开启支持php,帝国cms模板使用说明与技巧
  4. bilibili服务器维护7月,GitHub - thestarweb/bilibilidan: 一个B站弹幕姬,就是不会在第一时间维护。。支持插件!!...
  5. 常见颜色RGB颜色值
  6. 【装机】老毛桃的安装及使用教程
  7. window的dos命令学习笔记 七
  8. Angular Material 图标素材网址与使用
  9. 更改所有数据透视表的数据源
  10. mysql查询权限show grants_[MySQL]查看用户权限与GRANT用法