当前位置: 首页 > news >正文

前后端数据序列化:从数组到字符串的旅程(附优化指南)

🌐 前后端数据序列化:从数组到字符串的旅程(附优化指南)

📜 背景:为何需要序列化?

在前后端分离架构中,复杂数据类型(如数组、对象)的传输常需序列化为字符串。本文以 productPhotos 字段为例,解析其完整生命周期:前端数组 → 序列化为字符串 → 后端存储为字符串


mysql数据库中显示的格式
["fake-strategy/Rfu4RYYxDWGI9192e57fda02253decb709d99243b267_323610.jpeg","fake-strategy/WechatIMG364_710060.jpg"]
["fake-strategy/ImHmny77At2n9192e57fda02253decb709d99243b267_629653.jpeg","fake-strategy/WechatIMG364_777011.jpg"]

safari浏览器解析预览中显示的格式
"productPhotos": "[\"fake-strategy/Rfu4RYYxDWGI9192e57fda02253decb709d99243b267_323610.jpeg\",\"fake-strategy/WechatIMG364_710060.jpg\"]",
"purchaseRecords": "[\"fake-strategy/ImHmny77At2n9192e57fda02253decb709d99243b267_629653.jpeg\",\"fake-strategy/WechatIMG364_777011.jpg\"]",

🔄 当前实现流程(Mermaid 流程图)

1.用户上传图片
2.提交前序列化
3.HTTP 传输
4.存储到数据库
5.查询时反序列化
前端: Array 对象
form.productPhotos = ["url", "url"]
JSON.stringify → "[\"url\", \"url\"]"
后端接收字符串
数据库字段类型: VARCHAR/Text
前端解析为数组渲染

⚖️ 当前方案分析

✅ 优点

  1. 兼容性高
    🛢️ 所有关系型数据库(MySQL/PostgreSQL)均支持字符串存储
  2. 开发简单
    🛠️ 避免创建关联表(如 product_photos 表)
  3. 协议友好
    🌍 适配 HTTP 文本传输特性

❌ 缺点

问题类型具体表现
性能损耗频繁的 JSON.stringify/parse 增加 CPU 开销
查询困难无法直接使用 SQL 查询图片属性(如按类型过滤)
维护风险字符串格式错误导致解析失败(如缺少闭合引号)

🚀 优化方案思维导图(Mermaid Mindmap)

在这里插入图片描述


🛠️ 具体优化建议

方案一:直接使用原生 JSON 类型(以 PostgreSQL 为例)

-- 建表语句
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    photos JSONB NOT NULL
);

-- 查询示例(查找包含 "main" 类型图片的记录)
SELECT * FROM products 
WHERE photos @> '[{"type": "main"}]';

方案二:元数据扩展

// 前端数据结构升级
interface ProductPhoto {
  url: string;
  type: 'main' | 'detail'; // 明确分类
  size?: number; // 文件大小(KB)
  uploadedAt: string; // ISO 时间戳
}

// 提交时自动补充元数据
form.productPhotos = photos.map(photo => ({
  ...photo,
  size: calculateFileSize(photo.file),
  uploadedAt: new Date().toISOString()
}));

方案三:客户端压缩(减少传输量)

<template>
  <w-form-multiple-image 
    :before-upload="compressImage"
  />
</template>

<script>
import imageCompression from 'browser-image-compression';

export default {
  methods: {
    async compressImage(file) {
      const options = {
        maxSizeMB: 1,
        maxWidthOrHeight: 1920,
        useWebWorker: true
      };
      return await imageCompression(file, options);
    }
  }
}
</script>

📌 总结

方案适用场景技术栈要求
当前方案简单业务快速迭代无特殊要求
原生 JSON 类型高频查询/更新场景PostgreSQL/MongoDB
客户端压缩移动端流量敏感需兼容 Web Workers

核心原则:根据业务阶段选择合适方案,避免过度设计! 🎯

相关文章:

  • 爬虫:请求头,requests库基本使用
  • 《C++Linux编程进阶:从0实现muduo 》-第8讲.C++面试如何高效获取线程ID
  • nginx如何重启
  • 物联网时代,HMI 设计的创新机遇与挑战
  • 人工智能的三个主义(行为主义、连结主义、符号主义)的整体性关系(并非割裂)
  • MySQL注入中user-agent和cookie存在的注入
  • OpenCV 从入门到精通(day_03)
  • 化学方程式配平 第33次CCF-CSP计算机软件能力认证
  • WEB安全--文件上传漏洞--黑名单绕过
  • 《Linux运维总结:基于银河麒麟V10操作系统+ARM64架构CPU二进制部署单机ACL版consul v1.18.1》
  • 【linux】管理磁盘——RAID10(含备份)与逻辑卷管理
  • Java线程池详解
  • 用deepseek创建可运行的简单的php框架
  • 如何在k8s中对接s3存储
  • 多线程 - wait notify
  • Apache Commons Lang3 常用方法详解
  • 大数据(4.3)Hive基础查询完全指南:从SELECT到复杂查询的10大核心技巧
  • 【超分辨率】基于DDIM+SwinUnet实现超分辨率
  • 深入理解pthread多线程编程:从基础到生产者-消费者模型
  • Android: Handler 的用法详解
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查
  • 河南一女子被医院强制带走治疗,官方通报:当值医生停职
  • 101岁陕西省军区原司令员冀廷璧逝世,曾参加百团大战
  • 女生“生理期请病假要脱裤子证明”?高校回应:视频经处理后有失真等问题
  • 下周或迎外贸“抢出口”高峰,跨境电商敏感货物如何便利化“登机”?
  • 南宁一学校发生伤害案件,警方通报:嫌疑人死亡,2人受伤