【从头开始学JAVA】泛型 序列化与反序列化

从零开始的JAVA反序列化漏洞学习(一) 前言: 大概是决定复现CVE,第一个拿cve-2016-4437试试,但是之前没接触过JAVA,在历经磨难安装好IDEA maven和依赖环境,跟着各位师傅的教程调试源代码发现大佬们的教程都是跟到 可以控制传入readObject()的反序列化就没了,再细查便是什么CC4,CC3.1之类看上去很深奥的东西。深感基础不足,从头开始学JAVA的各种机制,如有疏漏不足请在评论中指出。 利用Java反射执行代码 Java的反序列化是离不开Java的反射机制的,反射机制离不开Object类和Class类,关于反射已经 阅读详情

泛型

"语法糖"

引入泛型-主要目的是想通过泛型来约束集合中的元素的类型
泛型的好处:可以把报错的时机提前,在编译器就报错,而不是运行后才抛出异常
在向集合中添加元素时,会先检查元素的书写类型,不是要求的类型就编译失败
<type>  --type的值应该如何写?
需要查看要存放的数据类型时什么,依据类型来定义
但是type必须是引用类型,不能是基本类型
如:List<String> list2 = new ArrayList<String>();

public class TestStudy <Student>{}
public interface Collection<E> {}
public <E> void print(E e){}
在方法的返回值前声明了一个<E>,表示后面出现的E是泛型而不是普通的java变量

 public static void main(String[] args) {
        Integer[] a ={1,2,3,4,5};
        
        String[] b= {"上","山","打","老","虎"};
        
        Double[] c={6.0,6.6,6.66,6.666};
        
        print(a);
        
    }
        /**泛型可以实现通用代码的编写,使用E表示元素是Element类型*/
        /**泛型的语法要求:如果在方法上使用泛型,必须两处同时出现
         * 一个是传入的参数的类型,另一个是方法声明上返回值类型之前的泛型*/
        private static <E> void print(E[] a) {
            for (E d :a) {
                System.out.println(d);
            }
        }
}

 

四种集合迭代方式

 

package cn.tedu.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**本类用于测试List的迭代*/
public class TestList2 {
    public static void main(String[] args) {
        //1.创建List接口对象
        List<String> list =new ArrayList<String>();

        //2.向集合中添加元素
        list.add("喜羊羊");
        list.add("美羊羊");
        list.add("沸羊羊");
        list.add("小肥羊");
        list.add("烤全羊");

        //3.测试集合的迭代
        /**集合的迭代方式
         * 1.for循环
         * 2.增强for循环/高效for循环/foreach循环
         * 3.iterator迭代器循环
         * */
        //方式一:因为List 集合是有序的,元素是有下标的,所以可以根据下标进行遍历
        for (int i = 0; i < list.size(); i++) {
            //根据下标获取集合中对应位置上的元素
            System.out.println(list.get(i));
        }
        System.out.println("*****以上方式一*******");

        //方式二:  1 2 : 3   , 3是要遍历的元素,2是遍历得到的元素类型,1是 遍历得到的元素名字
        for (String s :list) {
            System.out.println(s);
        }
        System.out.println("*****以上方式二*******");

        //方式三:通过集合对象的迭代器进行迭代
        /**1.获取指定集合的额迭代器*/
        Iterator<String> it =list.iterator();
        /**由于我们不知道集合有多少元素,所以用while循环遍历集合所有元素*/
        while(it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("*****以上方式三*******");

        //方式四:listIterator()是List接口独有的
        //listIterator是Iterator的子接口,可以拥有父接口的方法,还拥有自己独有的方法(逆序遍历)
        Iterator<String> it2 =list.listIterator();
        while(it2.hasNext()){
            System.out.println(it2.next());
        }
        System.out.println("*****以上方式四*******");


    }

}

 

序列化与反序列化

1.封装学生类

package cn.tedu.seri;

import java.io.Serializable;
/**本类如果想要实现序列化,必须实现可实现可序列化接口,否则报错
 * 报错信息:NotSerializableException:cn.tedu.seri.Student
 * Serializable是一个空接口,里面一个方法都没有,作用:当作标志,标志着这个类可以被序列化*/
/**本类用来封装学生类*/
public class Student implements Serializable {
    /**需要给每个进行序列化的文件分配唯一的UID值*/
    //private static final long serialVersionUID=1L;
    //1.定义并封装属性
    private  int sno;//学号
    private  String name;
    private  String address;
    private  char gender;//性别
    //2.提供无参构造--必须手动提供无参构造,否则会被全参覆盖
    public Student() {
        System.out.println("无参构造");
    }
    //3.生成全参构造
    public Student(int sno, String name, String address, char gender) {
        this.sno = sno;
        this.name = name;
        this.address = address;
        this.gender = gender;
        System.out.println("全参构造");
    }

    /**右键空白生成Getter and Setter 方法*/
    public int getSno() {
        return sno;
    }

    public void setSno(int sno) {
        this.sno = sno;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }
    /**打印结果:cn.tedu.seri.Student@677327b6
     * 想看*/
    @Override
    public String toString() {
        return "Student{" +
                "sno=" + sno +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", gender=" + gender +
                '}';
    }
}

 

2.测试序列化与反序列化

package cn.tedu.seri;

import java.io.*;

/**本类测试序列化与反序列化*/
public class TestSerializable {
    public static void main(String[] args) {
        //f();//测试序列化
        f2();//测试反序列化
    }

    /**序列化方法*/
    private static void f() {
        //声明在本方法中生效的序列化类型变量,局部变量需要初始化,本处指为null
        ObjectOutputStream out =null;
        try {
            //1.创建用来序列化的流对象OOS
            out=new ObjectOutputStream(new FileOutputStream("D:\\ready\\1.txt"));
            //2.创建要序列化的Student对象
            Student s =new Student(888,"泡泡","地球",'男');
            //3.通过OOS流对象来序列化对象输出到指定文件
            out.writeObject(s);
            System.out.println("序列化成功!");
        }catch (Exception e){
            System.out.println("序列化失败!");
            e.printStackTrace();//当捕获到异常,打印错误信息到控制台
        }finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**反序列化方法*/
    private static void f2() {
        //声明在本方法中生效的序列化类型变量,局部变量需要初始化,本处指为null
        ObjectInputStream in=null;
        try {
            //1.获取反序列化大的流对象OIS
            in =new ObjectInputStream(new FileInputStream("D:\\ready\\1.txt"));
            Object o =in.readObject();
            System.out.println(o);
            System.out.println("反序列化成功!");
        }catch (Exception e){
            System.out.println("反序列化失败");
            e.printStackTrace();
        }finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}

 

XStream CVE-2021-21351反序列化漏洞:从原理到实战复现与防御 Java反序列化机制允许将对象状态转换为字节流进行存储或传输,其核心在于通过反射重建对象图并执行相关方法。这一特性在带来便利的同时,也引入了严重的安全风险:攻击者通过构造恶意序列化数据,可触发非预期的代码执行路径。XStream作为广泛使用的Java对象与XML转换库,其默认信任反序列化数据源的特性,结合特定版本中存在的转换器缺陷,形成了典型的反序列化漏洞利用链。在CVE-2021-21351漏洞中,攻击者通过精心构造的XML数据,利用FilterIterator组件触发JNDI查找,最终可能实现远程代码执 阅读详情

相关推荐

【Spring Boot丨序列化、反序列化】

Spring boot 实现序列化、反序列化详解

爱媳妇儿爱编程 6270

Java学习记录——高级:泛型、序列化、反序列化

Object 类 Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。 Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。(把类型当作参数) 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面

weixin_44099043的博客 1353

图灵奖:计算机科学领域的诺贝尔奖

最后,图灵奖也是计算机科学领域发展的重要推动力之一,它促进了该领域的进步和繁荣。图灵奖作为计算机科学领域的诺贝尔奖,不仅是对获奖者卓越贡献的肯定,更是对整个计算机科学领域的推动和激励。在未来的发展中,我们期待看到更多的科学家和团队在图灵奖的激励下不断取得新的突破和创新成果为计算机科学的发展注入新的活力和动力。Vinton G. Cerf和Robert E. Kahn:2004年图灵奖得主,由于他们在互联网方面开创性的工作而获奖,这包括设计和实现了互联网的基础通讯协议TCP/IP,以及在网络方面的卓越领导。

wangnvshibeib的博客 2624

Java处理泛型的反序列化问题

由于Java的泛型是伪泛型(编译后类型消除),这就导致了泛型参数的反序列化问题。要处理该问题,根本就是解决泛型丢失问题。在之前的项目中,序列化方法和反序列化方法不在一个接口中(读写服务分离),解决方法是在进行序列化写入时,将对象的Class也作为参数进行缓存,在读取时即可显式获取泛型类来进行反序列化。【这种方法就不详细说明】若是读写在同接口或者同类中,即可使用反射获取泛型参数类来进行反序列化。

kubo989的博客 850

APS生产排程系统——ERP、MES、APS系统的关联和区别

APS生产排程系统——ERP、MES、APS系统的关联和区别

这里有一只小马吖 2万+

计算机视觉之姿态识别(原理+代码实操)

计算机视觉中的姿态识别原理+模型介绍,同时通过代码实操简单的演示基于mediapipe的单人姿态识别。

输出既学习 3万+

含有泛型的 JSON 反序列化问题

含有泛型的 JSON 反序列化一、背景二、分析2.1 事出诡异必有妖三、解决之道3.1 猜想验证3.2 举一反三四、总结 一、背景 今天无聊之园提了一个问题,涉及的示例大致如下: public static void main(String[] args) { String jsonString = "[\"a\",\"b\"]"; List<String> list = JSONObject.parseObject(jsonString, List.c

悟鸣的技术博客 1万+

Microsemi Libero使用技巧1——查看芯片资源占用情况

Microsemi Libero使用技巧——查看芯片资源占用情况 前言 与MCU不同,FPGA的资源主要包括:逻辑资源,IO资源,Flash大小,PLL资源,SoC硬核处理器资源等,其中逻辑资源和IO资源是我们主要关心的,本篇文章将介绍,如何通过Microsemi Libero IDE来查看工程的详细资源占用情况。 A2F200M3F的资源 以Microsemi SmartFusion系列A2F2...

whik1194的博客 5693

Java Jackson TypeReference获取泛型类型信息【反序列化】

JSON序列化反序列化的框架有很多,最常见的Jackson、阿里巴巴开源的FastJson、谷歌的GSON、apache提供的json-lib等。 本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理。对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。 Jackson ObjectMapper的readValue可以将Json字符串反序列化为Java对象。

单枪匹码 2423

GEE:连续变化检测 CCD 第一步(导出ee.Algorithms.TemporalSegmentation.Ccdc函数的结果)

连续变化检测与分类(Continuous Change Detection and Classification, CCDC)主要有两个组件,一个连续变化检测 CCD,另外一个分类。在 Google Earth Engine (GEE)平台上进行 CCD 时间序列变化检测的时候,为了防止内存超限问题,将代码分为2阶段执行。第一阶段是运行 `ee.Algorithms.TemporalSegmentation.Ccdc` 函数,本文将详细介绍 CCD 的第一阶段的代码。

养乐多的博客 2492

Scratch全攻略:从入门到实践的编程之旅

Scratch 是一款由麻省理工学院(MIT)开发的图形化编程工具 ,它诞生的初衷是为了让编程教育更加普及,尤其是让孩子们能够轻松接触和学习编程。与传统的基于文本代码的编程方式不同,Scratch 通过将编程指令以图形化的积木形式呈现,极大地降低了编程的门槛,让编程变得如同搭积木一样简单有趣。

邓邓子的博客 1万+

json反序列化时泛型处理

分别介绍fastjson、jackson、gson在反序列化数据时需要处理泛型的使用方式

dream_xin2013的专栏 4321

TBOX电源方案的详细讲解与分析

输入保护电路是确保车载电子系统稳定性的关键。通过合理选择TVS二极管、保险丝和浪涌抑制器等元器件,能够有效防止来自电源系统的瞬态过电压、浪涌和过流问题,保护后续电路免受损害。针对不同的电源环境和应用场景,可以通过提升功率、优化热管理以及选择高效元器件来进一步提高系统的保护能力和可靠性。

weixin_43199439的博客 1070

java泛型fastjson阅读泛型解析乱谈一通

乱谈一通泛型和fastjson

jzlhll123的专栏 1257

手把手教你学simulink实例--Simulink在电动汽车故障诊断与预测中的应用仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车故障诊断与预测仿真。该系统能够全面评估故障诊断与预测算法的性能,验证其在不同故障场景下的有效性,并通过优化设计提高系统的可靠性和安全性。引入智能算法:结合人工智能技术,实现更智能的故障诊断与预测。扩展功能:增加对多种车型和故障类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

MHD0815的博客 256

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Java】序列化和反序列化

而这个writeString()往往是这样写的,字符串长度(不是大小)小于两个字节,就先写入一个字节的TC_STRING(16进制 74),然后调用writeUTF(),写入一个signature,这好像跟jvm有关。要使用一个类,就要先把它加载到虚拟机中,在加载完类之后,堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个class对象),这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构,这个对象就像一面镜子,透过镜子可以看到类的结构,所以形象的称之为:反射。

double222222的博客 1210

Camera2Demo

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

java序列化与反序列化

最近抽空回顾了下java的序列化和反序列化,觉得之前了解的很浅显,索性对底层代码做了些分析。看了些师傅的文章,把笔记整理了下。个人觉得还可以。 序列化与反序列化 java序列化指的是将java对象转化为字节序列的过程。 java反序列化指字节序列恢复到java对象。 一 基础知识 计算机内存最小单位为一个二进制位,即 0或1。 我们把这个二进制位称为一个bit(比特)位。 一个字节(byte)有八个比特位,即 byte = 8*bit。 如果八个bit位都为1,即这个字节最大为 FF =.

weixin_68320784的博客 579

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

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python之序列化与反序列化(pickle反序列化篇上)

浅谈Python反序列化原理

errorr0 1208

【java筑基】IO流进阶之文件随机访问、序列化与反序列化

全面深入的介绍文件的进阶操作:随机访问,序列化与反序列化

半旧518的博客 650

浅谈Python Pickle反序列化

序列化说白了就是将对象转换成字节流,便于保存在内存、文件或者是数据库中;反序列化则是序列化的逆过程,将字节流还原成对象。

YJ_12340的博客 1120

关于反序列化时抛出java.io.EOFException异常

反序列化时抛出java.io.EOFException异常 问题描述:在反序列化对象时,对象IO流将文件的全部类反序列化之后,始终会抛出java.io.EOFException.(想把序列化的对象一个一个拿出) 原因:java API文档中对于反序列化对象时使用的java.io.ObjectInputStream类的readObject()方法的描述有一句话是"该方法始终会抛出异常",也就是说该异常无法避免的. 案例代码 ObjectInputStream ois2 = null;

jj89929665的博客 4447

全网最全详细的反序列化攻击知识梳理,从零基础到精通,收藏这篇就够了!

将对象或者数组转化为可存储的字符串。在PHP中使用serialize()函数来将对象或者数组进行序列化,并返回一个包含字节流的字符串来表示。php#创建一个类//实例化对象//序列化对象//输出序列化后的结果?i:1111;b:0;}"O代表是对象类型,如果是a那就是数组类型;4是对象名称的长度,test是对象名称,3代表是有3个成员。s:1:“a”;第一个s代表变量名称是字符串类型,a是变量名称;第二个s代表变量值是字符串类型,7是变量值得长度,后面是变量的值。i:1111。

Libra1313的博客 1149

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

java反序列化cb链大家应该都玩过,博主当初是通过看shiro无依赖了解到的,最近在重学基础,就手把手一点一点调试一遍。记得11月份自博主反思之后,认为自己渗透的学习深度广度都太差,对漏洞的学习只是学了一层表面,老是这么搞可不行啊,花一两个月时间重新看了几百集java语言基础。这篇文章严格来说是学习java利用链的部分学习笔记,这也算博主部分学习的一小段总结吧,话不多说,直接开始

HBohan的博客 696

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

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

如切如磋,如琢如磨 6041

序列化和反序列化

好好的深入梳理下序列化与反序列化

Web_blingbling的博客 393

前序、后序及层次遍历实现二叉树的序列化与反序列化

本文使用二叉树的先序遍历、后续遍历以及层次遍历分别对其进行序列化与反序列化操作

weixin_45685353的博客 513
上一篇: 【从头开始学JAVA】 IO流 API
下一篇: 【从头开始学JAVA】Collection集合 Map
Memory_314
博客等级 码龄6年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值