以前端角度来看序列化

前端使用google-protobuf传输数据 google-protobuf理解安装与使用 理解 protoBuf(下面简称PB)全称Protocol Buffers,由Google公司开发出来且其内部广泛使用,对比其它的编解码框架,有如下几个优点: 跨语言支持,如Java、C++、Python、js等 编码后消息更小,因此,更有利于网络传输和本地存储,当然,性能也很强大 不同版本协议的数据结构前向兼容 以我个人站在前端的角度去看,pb虽... 阅读详情

1. what? why?

  • 序列化:将数据结构或对象状态 转换成一个可以存储或传输的格式 的过程

    • 意味着可以将复杂的数据结构转换成简单的字节流或字符串,以便于存储或传输
  • 反序列化:将这些数据恢复成原始形式的过程,是序列化的逆过程

  • 从序列化本质来看,主要是 存储 和 传输

传输方面:不同程序通信会发送各种各样的资源(文本、图片、音频等),但网络传输是通过二进制序列的形式传输的,因此需要将原有数据序列化,再在接收端恢复

存储方面:不同机器、执行环境,可能有不同的数据处理方式,可能会导致反序列化出现问题,因此也需要序列化

常见使用场景:

  • 数据持久化,保存到数据库(二进制)
  • 数据从数据库里读出 来到java等后端语言(反序列化)
  • 数据从后端 ——> 前端(JSON)
  • 数据从JSON变成JS对象(JSON.stringify、JSON.parse)

2. how?

JSON.stringify & JSON.parse

在js中提到对象转JSON字符串,基本上都会想到JSON.stringify方法,以及对应的解析方法JSON.parse

以JSON.stringify为例,前端日常可能会用到的场景:

  • 数据传输:
    • 服务端返回JSON string,需要用JSON.parse进行解析
    • 客户端在POST时要将JSON用JSON.stringify转成string
  • 用localStorage存储数据时要转string,数据需要序列化
  • 可能会用JSON.stringify和JSON.parse做对象深拷贝

但JSON.stringify序列化会存在以下问题:

  • 转换的数据中,包含function、undefined、symbol值,以及不可枚举属性,序列化后会消失
  • 包含NaN、Infinity值(含-Infinity)、null,序列化后结果是null
  • 包含Date对象,会变成字符串
  • 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,只会序列化可枚举的属性
  • 包含RegExp,会变成空对象
  • 循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误

实现axios序列化

axios序列化整个流程:

    section 发送请求
        发起网络请求 -> 序列化请求数据 -> 发送请求

    section 接收响应
        接收响应数据 -> 反序列化响应数据 -> 处理响应数据

Content-type对应不同格式的请求数据,前端在POST请求时需要根据后端接口的要求选择合适的类型,并正确设置请求头,常见的类型:

  • application/json:用于发送JSON格式的数据,请求体是JSON对象 或 数组
  • application/x-ww-form-urlencoder:用于发送URL编码的表单数据,请求体是以键值对的形式发送,键值对之间以&隔开
  • application/xml:用于发送XML格式的数据,请求体是一个XML文档
  • multipart/form-data:用于发送二进制数据,通常用于上传文件。请求体的格式是多部分的,每个部分可以是一个文本字段或一个文件

默认情况下,axios会将请求数据自动转换成JSON格式发送,后台对应的接口正好是处理Content-Type=application/json类型的入参,此时不需要处理数据。

但有的时候后台是按照application/x-ww-form-urlencoder方式在接口中进行数据获取和处理的,我们post正常传参后台是收不到的,这时我们必须对参数数据进行序列化处理,以表单形式(键值对)发送给后台

axios提供了两种序列化参数的方式,着重掌握qs:

  • 使用URLSearchParams对象:在浏览器中使用,它能够自动处理URL参数的编码问题
  • 使用qs库:qs库是一个解析和字符串化URL查询字符串的库

qs

qs是一个用于处理URL查询字符串的库,可以用来处理复杂的请求参数,如嵌套对象、数组等。一般当需要发送含复杂数据结构的POST请求时,就可以用qs将JS对象序列化成URL查询字符串

qs.stringify:将 对象 序列化成URL的形式,以&进行拼接。它跟JSON.stringify有所不同:

var a = {name:'kk',age:10};
qs.stringify(a)
// 'name=kk&age=10'
JSON.stringify(a)
// '{"name":"kk","age":10}'

qs.parse:将URL解析成对象的形式

在post请求后端数据使用qs序列化:

npm install qs
// user.js
import qs from 'qs';
export function loginAPI(paramsList) {
  return myAxios({
    url: '/api/login',
    method: 'post',
    data: paramsList,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    transformRequest: [
      (data) => {
        return qs.stringify(data)
      }
    ],
  });
}
const axios = require('axios');
const qs = require('qs');
const data = {
  user: {
    name: 'John',
    age: 30
  },
  interests: ['coding', 'reading']
};
axios.post('/api/user', qs.stringify(data))
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });
序列化和反序列化二叉树在前端的应用 序列化是指将数据结构转化为可存储或传输的格式,通常是一个字符串或字节数组。反序列化则是将序列化后的数据重新转化为原始的数据结构。在前端开发中,常见的序列化格式包括 JSON(JavaScript Object Notation)和 XML(eXtensible Markup Language)。这些格式可以用于将 JavaScript 对象序列化为字符串,或者将字符串反序列化为 JavaScript 对象。 阅读详情

相关推荐

esim分布式云卡池技术

eSIM卡,即Embedded-SIM,嵌入式SIM卡。eSIM卡的概念就是将传统SIM卡直接嵌入到设备芯片上,而不是作为独立的可移除零部件加入设备中,用户无需插入物理SIM卡。这一做法将允许用户更加灵活的选择运营商套餐,或者在无需解锁设备、购买新设备的前提下随时更换运营商。未来通用的eSIM标准建立将为普通消费者、企业用户节省更多移动设备使用成本,并带来更多的便利、安全性。 2018年 3月7日,中国联通宣布,正式在上海、天津、广州、深圳、郑州、长沙6座城市率先启动“eSIM一号双终端”业务的办理。[.

著名博客 3710

序列化(前端)

序列化 前言 提到序列化,总感觉不是那么了解,在网上查来查去,最后看到了JSON.stringify()方法。这个和序列化有关系吗?因为我也是做前端的嘛,也算是做了很长长时间,发了那么多请求,这个知识竟然不知道!!!之前只知道用,但是从来不考虑为什么要用。 学习某个知识,知道它怎么用是最基础的,我们应该还需要清楚为什么用它,要有深入思考的能力。闲话不多说,我做一下总结吧。 序列化 谈及定义,前端和后端的序列化还是有区别的。 前端 定义:将对象转换成字符串。 后端 定义:将java对象转换成字节流序列(二

weixin_44430893的博客 2040

企业微信微盘API权限避坑指南:为什么你的Python脚本无法获取文件列表?

本文深入解析了企业微信微盘API的权限模型,解释了为何即使使用超级管理员账号,Python脚本也可能因权限不足而无法获取文件列表。核心在于微盘API基于“应用身份”而非“用户身份”进行校验,应用只能访问自身创建的空间。文章提供了构建文件上传代理、利用事件回调等合规的替代方案,帮助企业实现高效数据同步。

weixin_29322553的博客 533

前端中的序列化与反序列化

1、序列化 序列化是指将数据、对象等按一定格式转换成字符串的过程。 举例: let person = { name: 'John', age: 25 }; //序列化 let personString = JSON.stringify(person); console.log(personString); //"{"name":"John","age":25}" let person = { name: 2、反序列化 反序列化是一种把字符串(结构化的数据)转换成对应的数据

qq_45217161的博客 1259

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 616

爬虫风控实战:当你的代理IP被数美滑块盯上时,如何优雅破解?

本文深入探讨了爬虫风控对抗中数美滑块验证码的破解与防御策略。通过分析数美滑块的多层防御机制,提出了代理IP池精细化管理、请求特征拟人化改造以及工程化滑块验证解决方案等系统性方法,帮助开发者有效降低验证码触发率,提升爬虫效率。

weixin_27419879的博客 207

前端JS高阶技法:序列化、反序列化与多态融合实战

序列化与反序列化作为数据转换的核心能力,与多态这一灵活代码设计的核心理念,在现代前端开发中协同运作,提供了高效的数据通信与扩展性支持。序列化与反序列化的实现方式、使用场景及关键技巧JavaScript多态的设计模式与实战应用性能优化与安全防御策略通过流程图与案例,展示技术结合的工程实践价值。

领码SPARK - 以无代码之星火,燎原数字之未来! 2146

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解

本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。

weixin_29215391的博客 323

前端接口参数序列化

2. JSON.stringify([cur_case_id]) , [cur_case_id] 数组。问题:前端传参数时,本来是数组格式,打印出来也是数组格式,但是接口查看就是拆开的数组。1. 将pagination里的数组参数,统一放到一个item参数对象里。

weixin_65969505的博客 430

STC8G1K08A的10位PWM避坑指南:为什么你的占空比调节总失效?(附寄存器操作时序图)

本文深入剖析了STC8G1K08A单片机10位PWM功能中占空比调节失效的核心原因,揭示了数据手册未明确指出的寄存器操作时序陷阱。通过对比错误与正确配置的波形,文章指出关键在于更新占空比高2位前需临时关闭PWM输出,并提供了经过验证的安全操作宏与函数库,帮助开发者彻底解决此问题,实现0%-100%的平滑控制。

yyy34的博客 750

YOLO-World:从入门到实战的多模态目标检测全指南

想象一下,你给模型一张“公园”的图片,再输入文字“红色的郁金香”,它能直接在图中框出所有红色郁金香的位置——这就是多模态目标检测:结合图像视觉信息和文本语义信息,同时完成“是什么”(分类)和“在哪里”(定位)的任务。传统目标检测(如YOLOv5、YOLOv8)只能识别预定义的类别(比如训练时学过“猫”“狗”),但多模态目标检测摆脱了“类别预定义”的限制,只要文本能描述,它就能检测,这就是“开放词汇检测(Open-Vocabulary Detection)”的魅力。

know_F0727的博客 206

js 序列化_从前端角度来理解序列化

什么是对象序列化?  对象序列化是指将对象的状态转换为字符串(来自我这菜鸟的理解,好像有些书上也是这么说的,浅显易懂!);  序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程(来自“百度百科—序列化“,学术性强,略显高端);二.为什么会有对象序列化?  世间万物,都有其存在的原因。为什么会有对象序列化呢?因为程序猿们需要它。既然是对象序列化,那我们就先从一个对...

weixin_39566578的博客 287

9.13华为OD机试真题 新系统 - 手机桌面整理 (Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【手机桌面整理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【 手机桌面整理】多语言题解。

qq_45776114的博客 642

JSON对象花样进阶

通过向传递第二个参数(replacer函数),可以实现自定义序列化逻辑。// 忽略所有字符串类型的属性// 输出: {"species":"Dog"}

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1160

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

前端常用的一些代码段

文章目录判断多个时间区间是否有交叉A追逐B(点A向点B靠近)获取随机数区间角度b趋向角度a简单的碰撞检测el中是否包含classname判断el上有没有className,有的话就移除,没有的话就添加上xpath获取单个elementxPath获取element集合父节点parent中是否存在子节点 child隐藏element获取一个元素内的所有图像添加一个元素的事件侦听器移除一个元素的事件侦听器在给定元素上触发特定事件,且可选传递自定义数据确认指定元素是否在视口可见获取当前页面的滚动位置平滑滚动到页面顶

榴莲不好吃的专栏 1283

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

前后端数据不一致?揭秘Python调试中隐藏的4个致命陷阱

解决前后端数据不一致难题,揭秘前端后端接口调试Python过程中的4个常见陷阱。涵盖跨域处理、数据序列化、类型转换与编码问题,结合实际开发场景,提供高效定位方案。提升联调效率,值得收藏。

AlgoPerch的博客 686

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ThreeJs功能演示——几何体操作导入导出

1、内部创建几何体导出编辑能力。

u010595191的博客 529

FAST 颜色工具 ColorHSV.equalValue() 详解:HSV 色彩空间的相等性判断实战指南

> 本文聚焦 [@microsoft/fast-colors](https://link.gitcode.com/i/b5b4092860199d5ce6566603c743e801)(FAST 自适应界面系统的颜色工具库)中 `ColorHSV` 类的 `equalValue()` 方法,围绕其在 HSV(色相、饱和度、明度)色彩空间下的颜色相等性判断展开。读完本文,你将掌握 `equalVal

gitblog_00224的博客 222

Json序列化技术

从比特理解Json序列化方式 关于Json 可以说是web 开发不管是前端还是后端都是非常的熟悉,第一次接触Json,是在我大一的寒假,因为人生中第一个servlet原生项目中要使用所以进行了较为粗浅的研究: 当时乃至之后的很长一段时间的理解都是——json 就是前后端数据传输的一个约定的消息格式,这种消息格式因为前后端都支持,并且是一种规范,所以我可以将对象直接转为一个Json 字符串,然后写入到返回给前端的响应流中,但是其实并不理解为什么要这样做,只是了解到前后端对接可以这样做。 当仔细研究了协议和

Jeffrey_oWang的博客 9606

Django12:序列化Django对象

Django REST framework (DRF)是用于构建Web API 的强大而灵活的工具包。它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架。而Django中自带的序列化框架提供了一种将 Django 模型“翻译”为其他格式的机制。(1)RESTful(2)API设计规范 首先我们要知道,API并不是必须的,如果整个项目只有你一个人或者很少的人完成,完全可以直接用Django的模板引擎渲染发送到前端后直接操作。API的使用主要是为了解决多人开发,特别是前后端分

king_weng的博客 868

protobuf c++ 序列化为string_从前端的角度理解 Protobuf

Protocol Buffer 是什么 Protocol Buffers are a language-neutral, platform-neutral, extensible way of serializing structured data for use in communications protocols, data storage, and more, originally des...

weixin_39923945的博客 1680

django:Django Rest Framework——序列化

记录一次DRF复习过程。 需要先了解API,即应用编程接口。 开发者角度:网站开发人员开发的允许其他软件调用的数据接口,本质就是封装好一系列操作来返回某些数据或提供某些功能的函数。 使用者角度:使用者通过GET或POST等方法进行访问API,就能获取所需的JSON或字符串格式的数据或者所需的服务,就不用重复造轮子。 (参考文章) 普通的django项目是基于MVT模式的,而django的前后端分离项目基于MVVM模式,前后端耦合度进一步降低, 这就需要用到API了,而且是遵循RESTful规范(参考文章)

dangfulin的博客 833

数组,序列化,异常

使用场景:1.当不想把错误直接暴露给前端或想让前端从业务角度判断后端的异常2.或者Java提供的异常类型没有准确的表述业务上的含义的。

weixin_47375599的博客 605

Shiro 反序列化

摘要 本文详细分析了Apache Shiro 1.2.4及以下版本的反序列化漏洞(Shiro-550)。该漏洞源于RememberMe功能的AES加密机制存在缺陷:加密密钥硬编码为"kPH+bIxk5D2deZiIxcaaaA==",且未对反序列化进行安全过滤。攻击者可构造恶意Cookie,通过AES-CBC加密伪造序列化数据,最终触发ObjectInputStream.readObject()导致RCE。文章还提供了完整的漏洞环境搭建方法(JDK8u65+Tomcat8+Shiro1.

2502_91116367的博客 1291

Long类型参数传到前端精度丢失的解决方案

一、前言 由于公司数据库表的id是利用雪花算法生成的,所以实体类里面定义的数据类型为Long。但是这个数据传到前端时,发生了精度丢失的现象。本文记录了从java后端的角度如何解决这个精度丢失的问题,便于自己后续查阅。 二、问题的描述 前端通过ajax请求后端接口,返回json数据,然后将数据渲染到一个表格中。突然发现表格中id这一列出现了精度丢失的现象,这精度丢失是由前端引起的。 三、解决方案...

Thinkingcao的专栏 3946
上一篇: vue项目的性能优化
下一篇: 常见typescript面试题
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值