@responseBody + 序列化

article/2025/8/29 23:24:22

为什么转载@responseBody这个注解的博客呢?因为我在看序列化的时候,就在考虑,Spring中使用@responseBody的Json序列化,为啥不用最常用的Serializable序列化呢?直接转换为二进制流不好吗???

先说@responseBody

1、@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

2、使用

@RequestMapping("/login")@ResponseBodypublic User login(User user){return user;}

User字段:userName pwd 那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'

效果等同于如下代码:

  @RequestMapping("/login")public void login(User user, HttpServletResponse response){response.getWriter.write(JSONObject.fromObject(user).toString());}

 

再说序列化

什么是序列化?

内存中的数据对象只有转换为二进制流才可以进行数据持久化和网络传输。将数据对象转换为二进制流的过程称为对象的序列化(Serialization)。反之,将二进制流恢复为数据对象的过程称为反序列化(Deserialization)。序列化需要保留充分的信息以恢复数据对象,但是为了节约存储空间和网络带宽,序列化后的二进制流又要尽可能小。序列化常见的使用场景是RPC框架的数据传输。

1.Java原生序列化

  • Java类通过实现Serializable接口来实现该类对象的序列化,这个接口非常特殊,没有任何方法,只起标识作用.Java序列化保留了对象类的元数据(如类、成员变量、继承类信息等),以及对象数据等,兼容性最好,但不支持跨语言,而且性能一般。
  • 实现Serializable接口的类建议设置serialVersionUID字段值,如果不设置,那么每次运行时,编译器会根据类的内部实现,包括类名、接口名、方法和属性等来自动生成serialVersionUID。如果类的源代码有修改,那么重新编译后serial VersionUID的取值可能会发生变化。因此实现Serializable接口的类一定要显式地定义serialVersionUID属性值。修改类时需要根据兼容性决定是否修改serialVersionUID值:
  • 1.如果是兼容升级,请不要修改serialVersionUID字段,避免反序列化失败。
  • 2.如果是不兼容升级,需要修改serialVersionUID值,避免反序列化混乱。
  • 使用Java原生序列化需注意,Java反序列化时不会调用类的无参构造方法,而是调用native方法将成员变量赋值为对应类型的初始值。基于性能及兼容性考虑,不推荐使用Java 原生序列化。

2.Json序列化

  • JSON ( JavaScript O同ect Notation )是一种轻量级的数据交换格式。
  • JSON 序列化就是将数据对象转换为 JSON 字符串。
  • 在序列化过程中抛弃了类型信息,所以反序列化时只有提供类型信息才能准确地反序列化。
  • 相比前两种方式,JSON 可读性比较好,方便调试。
  • 序列化通常会通过网络传输对象 , 而对象中往往有敏感数据,所以序列化常常成为黑客的攻击点,攻击者巧妙地利用反序列化过程构造恶意代码,使得程序在反序列化的过程中执行任意代码。 Java 工程中广泛使用的 Apache Commons Collections 、Jackson 、 fastjson 等都出现过反序列化漏洞。如何防范这种黑客攻击呢?有些对象的敏感属性不需要进行序列化传输 ,可以加 transient 关键字,避免把此属性信息转化为序列化的二进制流。如果一定要传递对象的敏感属性,可以使用对称与非对称加密方
  • 式独立传输,再使用某个方法把属性还原到对象中。应用开发者对序列化要有一定的安全防范意识 , 对传入数据的内容进行校验或权限控制,及时更新安全漏洞,避免受到攻击。

http://chatgpt.dhexx.cn/article/VGtenFTp.shtml

相关文章

Django序列化器

一、序列化器作用 1、数据格式转换: 序列化: 对象 -> 字典 反序列化: 字典 -> 对象(OrderedDict) 2、校验参数合法性; 3、保存和修改数据; 二、定义序列化器 通过继承rest_framework.seri…

Qt知识点梳理 —— 自定义数据结构序列化与反序列化

文章目录 定义 Qt中序列化与反序列化 序列化: 反序列化: 自定义数据结构序列化与反序列化 项目结构 数据结构信息 执行效果 项目源码 开发环境 定义 序列化:将对象或数据结构转换为二进制序列 反序列化:二进制序列转换…

序列化作用

没有implements Serializable,你就不能通过rmi(包括ejb)提供远程调用。 serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。 serialization不但可以在本机做&#…

PHP反序列化

定义 序列化(串行化):是将变量转换为可保存或传输的字符串的过程; 反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用; 这两个过程结合起来,可以轻…

Spark序列化简介

参考文章:Spark序列化 spark之kryo 序列化 Spark序列化入门 1. 什么是序列化和序列化? 序列化是什么 序列化的作用就是可以将对象的内容变成二进制, 存入文件中保存反序列化指的是将保存下来的二进制对象数据恢复成对象 序列化对对象的要求 对象必须实现 Serial…

谈谈序列化的作用

文章目录 1. 写在前面2. 问题阐述3. 解释3.1 一些不够完整的解释3.2 一种完整的解释3.2.1 去地址3.2.2 节省空间 4. 小节参考链接 1. 写在前面 我们应该都用过各种序列化(serialization)的方法(如Python中的pickle.dumps)&#x…

Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用。为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,serialVersionUID 这个的值到底是在怎么设置的&#…

cas 原理分析

CAS 原理分析 1、了解java中锁的类型 1.1 悲观锁(Pessimistic Lock) 顾名思义,就是很悲观,假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上…

JAVA中的CAS算法

java 中的线程之间的栈空间是相互独立,堆空间是共享的 V:内存值就是主内存中i值 A:预估值(期望值)就是子线程拿到主内存的值(读取到高速缓存中的值) B:更新值是子线程拿到i值后,修改i的值 假设有两个线程…

面试:CAS算法原理

1、什么是CAS? CAS:Compare and Swap,即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的&#x…

CAS原理详解

CAS介绍 CAS全称是Compare And Swap,它的实现和它的字面意思一样,先比较后交换,它是CPU硬件层面的一种指令,从CPU层面能保证"比较并更新"这一段操作的原子性。 与synchronized关键字比较不同是synchronized是一种悲观锁…

CAS算法与ABA问题

锁是用来做并发最简单的方式,当然代价也是最高的。 独占锁是一种悲观锁,synchronized就是一种独占锁;它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起直到持有锁的…

CAS算法-实现原理

目录 CAS是什么? CAS解决了什么问题? CAS存在什么问题? CAS有哪些应用场景? cas的实现 最后 CAS是什么? CAS的全称为Compare and swap 比较并交换。CAS又经常被称为乐观锁,主要的三个变量,内存值…

并发策略-CAS算法

对于并发控制而言,我们平时用的锁(synchronized,Lock)是一种悲观的策略。它总是假设每一次临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果多个线程同时访问临界区资源,就宁可牺牲性…

深入理解CAS算法原理

转载自 深入理解CAS算法原理 1、什么是CAS? CAS:Compare and Swap,即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证…

CAS操作原理

1、什么是CAS? CAS:Compare and Swap,即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一…

CAS原理

一、CAS 1.1 CAS概述和作用 CAS的全称是: Compare And Swap(比较相同再交换)。是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。 CAS的作用:CAS可以将比较和交换转换为原子操作,这个原子操作直接由CPU保证。 CAS可以保证…

CAS算法详解

CAS算法 1、CAS概念: CAS是CompareAndSwap的缩写,中文意思是:比较并替换。当要进行CAS操作时,先比较内存地址和原来预期的 地址比较,如果相同,表示这块内存地址没有被修改,可以用新地址替换&…

CAS的原理和使用

CAS 文章目录 CAS一、学习CAS首先了解原子类?1. 何为原子类 二、 CAS是什么1. CAS是什么2. CAS原理3. 使用CAS实例代码4. CAS属于硬件级别保证5. 源码分析 三、CAS底层原理?如果知道,谈谈你对UnSafe的理解1. UnSafe2. 我们知道i线程不安全的&…

对cas算法的理解

cas算法主要关心3个值:内存值V,预期值A,要更新的新值B 如下图所示: 注:t1,t2线程是同时更新同一变量56的值 因为t1和t2线程都同时去访问同一变量56,所以他们会把主内存的值完全拷贝一份到自己…