1. 背景介绍

蓝凌 EKP 的表单引擎,是整个低代码平台的核心能力之一。它不仅仅是“存储表单”,更是 企业级应用快速构建的基础设施

  • 它支持各种复杂表单配置(字段、布局、校验、权限、联动、子表单)。

  • 它能灵活绑定流程,实现 表单 + 流程 + 权限 的一体化管控。

  • 它为低代码应用提供了统一入口,业务人员通过拖拽和配置就能搭建应用,而无需写代码。

正是这种 强大、灵活、稳定 的能力,让我们的表单引擎能支撑上千种应用场景,从人事、财务、行政到项目、客户管理,真正成为企业数字化的核心引擎。


业务强大带来的新挑战

然而,随着业务场景越来越复杂,表单配置越来越灵活,表单数据存储的性能瓶颈也逐渐显现。

  • 我们早期选择 XML 存储表单值,非常合理:它层次清晰、可扩展、可校验,能快速支撑表单配置和跨系统兼容。

  • 但在今天,表单数量激增、字段量级庞大,XML 的 解析性能和存储冗余 成为用户体验的隐形负担。

为了让表单引擎在保持业务强大的同时,也能在性能上持续突破,我们开始探索 将存储方式从 XML 演进到 JSON


为什么要转向 JSON?

  • 更快:JSON 解析效率普遍高于 XML,能明显提升表单的加载速度。

  • 更轻:JSON 格式更紧凑,占用存储空间更小。

  • 更兼容:JSON 已经成为前后端交互的事实标准,更符合微服务和低代码平台的技术生态。

  • 更灵活:数据库(如 MySQL、Postgres、OceanBase)原生支持 JSON 类型,后续还能直接做查询和索引。

这一转变,不是推翻 XML,而是顺应业务发展、技术迭代的 优化升级

表单引擎已经足够强大,但强大也意味着要面对更高的性能挑战。选择从 XML 向 JSON 迁移,是我们在持续优化用户体验、提升系统性能道路上的又一次重要演进。

2. 问题分析

  • 性能瓶颈:XML 解析开销大,DOM 需要完整装载,SAX 流式复杂。

  • 存储冗余:XML 标签过长,大字段占用存储空间明显。

  • 兼容性差:前后端交互大多倾向于 JSON,XML 转换额外耗时。

  • 举例:某个大表单打

  • 开耗时 2s+,主要在 XML 解析环节。

3. 技术对比:XML vs JSON

表格形式更直观:

维度XMLJSON
数据格式标签结构键值对结构
存储大小冗余多,占用大紧凑,节省空间
解析速度慢(需逐层解析)快(轻量解析库)
可读性层次清晰更简洁
Schema 约束有 (XSD)弱(需额外方案)
生态兼容传统系统友好前端 & 微服务友好

4. 优化方案设计

  • 保留表单定义的层次化结构,但存储层改为 JSON。

  • 数据库层:如果 DB 支持 JSON 类型,可以直接用 JSON 字段;否则用 TEXT 存 JSON 字符串。

  • 应用层:使用 Jackson/Fastjson/Gson 替代 XML 解析器。

  • 兼容方案:老表单继续用 XML,新增表单优先用 JSON。


5. 实践过程

  • 贴代码示例:

XML 解析示例(原有实现)

将Map 表单集合转换为XML

    public static String objectXmlEncoder(Object obj)throws FileNotFoundException, IOException, Exception {ByteArrayOutputStream baos = new ByteArrayOutputStream();XMLEncoder encoder = new XMLEncoder(baos);encoder.setPersistenceDelegate(BigDecimal.class,bigDecimalPersistenceDelegate);encoder.writeObject(obj);encoder.flush();encoder.close();String rtnVal = new String(baos.toByteArray(), "UTF-8");baos.close();return rtnVal;}

将XML 转换为Map 表单集合

  String safeIns = ins.replaceAll("[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]", "");ByteArrayInputStream byteArrayInputStream = null;try{byteArrayInputStream = new ByteArrayInputStream(safeIns.getBytes("UTF-8"));//通过流读取转换成表单集合数据。return objectXmlDecoder(byteArrayInputStream);}finally{if(byteArrayInputStream!=null){byteArrayInputStream.close();}}

JSON 解析示例(优化后)

将Map 表单集合转换为XML

import com.fasterxml.jackson.databind.ObjectMapperprivate  static ObjectMapper mapper = null;
static {mapper = new ObjectMapper();mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(),ObjectMapper.DefaultTyping.NON_FINAL_AT_LEVEL,JsonTypeInfo.As.PROPERTY);
}//传入参数Map 集合 obj ,直接转换为xmlpublic static String objectJsonEncoder(Object obj) throws Exception{String string = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);return string;}

将XML 转换为Map 表单集合

    //读取xml 转换为表单Map集合
public static Map objectJsonDecoder(String obj) throws Exception{Map datas = mapper.readValue(obj, HashMap.class);return datas;}
  • 对比两段代码的简洁度。

为了考虑兼容性和提供给用户选择,提供了开关让用户选择xml 和json。


6. 性能对比实验

  • 描述测试环境:JDK 版本、表单大小(如 500 字段)、数据库类型。

  • 给出测试数据(例如:解析 1000 次表单的耗时对比)。

  • 示例表格:

测试场景XML 解析耗时JSON 解析耗时提升比例
小表单(50 字段)120ms40ms3x
大表单(500 字段)2100ms600ms3.5x

7. 收益与思考

  • 收益:表单打开速度更快,存储空间减少,系统响应更快。

  • 不足:JSON 缺乏严格约束,需要额外校验。

  • 未来:考虑进一步利用数据库 JSON 索引、缓存机制,提升查询效率。


8. 总结

  • XML 在早期合适,但随着系统演进,JSON 更适合高性能和前后端一体化。

  • 从 XML 到 JSON 的迁移,带来了 性能优化 + 存储优化 + 技术栈统一 的价值。

  • 希望本文的经验能为有类似困扰的开发者提供参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94618.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94618.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/94618.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32高级定时器-输出比较模式

一.输出比较原理1.输出比较 通过定时器的外部引脚对外输出控制信号,将通道X(x1,2,3,4)通常设置为PWM1、PWM2模式。 2.比较寄存器 当计数器CNT和比较寄存器CCR的值相等时,输出参考信号OCxREF的信号的极性发生改变,其中OCxREF1(高电平)称为有效…

深入理解Unity中的`.meta`文件:以纹理文件为例

在Unity开发中,.meta文件是一个经常被提及但又容易被忽视的组成部分。这些隐藏的元数据文件在项目的稳定性和一致性中扮演着重要角色,尤其是在处理纹理文件时。本文将深入探讨.meta文件的作用、内容、版本控制以及常见问题,帮助开发者更好地理…

【机器学习】3 Generative models for discrete data

本章目录 3 Generative models for discrete data 65 3.1 Introduction 65 3.2 Bayesian concept learning 65 3.2.1 Likelihood 67 3.2.2 Prior 67 3.2.3 Posterior 68 3.2.4 Posterior predictive distribution 71 3.2.5 A more complex prior 72 3.3 The beta-binomial mod…

Gemini CLI 与 MCP 服务器:释放本地工具的强大潜力

前言 Gemini CLI 是一款强大的命令行工具,它将 Google 的 Gemini 模型带入了您的终端。然而,其真正的潜力在于通过 模型上下文协议(Model Context Protocol, MCP) 与外部工具集成。本文将结合两篇关键文章,深入探讨什…

HTTP、HTTPS 与 WebSocket 详解

HTTP、HTTPS 与 WebSocket 详解 在网络通信中,HTTP、HTTPS 和 WebSocket 是三种常见的应用层协议,分别适用于不同的场景。以下从定义、特点、工作原理和适用场景等方面详细解析: 一、HTTP(HyperText Transfer Protocol&#xff0c…

8月21日

#include "head.h"seq_p create_seq() {seq_p S(seq_p)malloc(sizeof(seq_list));if(SNULL){printf("malloc error");return NULL;}memset(S,0,sizeof(seq_list));return S; }//头插 void insert_head(seq_p S,int value,int len) {//判NULLif(SNULL){prin…

视频号存在争议了...

目前实测到:视频号里那套 争议信息提示加AI真相雷达,已经在不少视频下上线了(这是一个非常火爆的趋势!)伙伴们都知道,短视频里的观点来得快、走得也快,很多人看完就转发。你想想看,要…

音视频处理工作室:实时通信的媒体层设计

在开发视频会议、语音聊天等实时通信应用时,媒体层(Media Layer) 是整个系统的核心。它就像是一个专业的"音视频处理工作室",负责从采集声音画面到最终播放的全流程。本文将通过通俗易懂的比喻,解析媒体层中…

读《精益数据分析》:A/B测试与多变量测试

A/B测试与多变量测试:从入门到实战的完整指南 在数据驱动的时代,实验已经成为产品优化和商业决策的核心工具。而在众多实验方法中,A/B测试与多变量测试几乎是每一位产品经理、数据分析师、增长团队绕不开的关键词。 很多人第一次听到它们时&a…

中介者模式及优化

中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过引入一个“中介者”对象,封装多个对象(称为“同事对象”)之间的复杂交互关系,使同事对象无需直接相互引用,而是…

卷积神经网络的基本概念

卷积神经网络 CNN,即卷积神经网络,是一种深度学习算法,在图像处理,视觉识别等任务中表现出色。 卷积神经网络的组成 CNN模型的组件包括卷积层,池化层,全连接层。 卷积层:提取图像中的局部特征池…

亚远景- 从算法到刹车片:ISO/PAS 8800如何量化自动驾驶的“安全冗余”?

ISO/PAS 8800作为全球首个针对道路车辆人工智能安全的权威标准,通过全生命周期管理框架与量化安全指标,为自动驾驶系统构建了从算法到硬件的“安全冗余”量化体系,其核心逻辑可拆解为以下四层结构:一、数据层:量化训练…

【QT/C++】实例理解类间的六大关系之实现关系(Realization)

【QT/C】实例理解类间的六大关系之实现关系(Realization) 在前面章节讲完了实例理解类间的六大关系之泛化关系,效果不错,获得粉丝的一致好评!!! 接下来,本文我将继续尝试分享并总结…

Coze用户账号设置修改用户头像-后端源码

前言 本文将深入分析Coze Studio项目的用户头像修改功能后端实现,通过源码解读来理解整个头像上传和更新流程的架构设计和技术实现。用户头像修改作为用户个人信息管理系统的重要组成部分,主要负责处理图片文件上传、存储和用户信息更新,提升…

【Day 33】Linux-Mysql日志

一、数据库日志的核心作用故障恢复:当数据库因崩溃(如断电、进程异常)、误操作(如删表)导致数据丢失时,通过日志恢复数据至一致状态。数据一致性保障:确保事务的 ACID 特性(尤其是原…

服务器支持IPv6吗?如何让服务器支持IPv6

服务器是否支持 IPv6 需要视具体的服务商、服务器配置和网络环境而定。以下是关于 服务器支持 IPv6 的相关知识、如何检查支持情况,以及如何配置服务器以支持 IPv6 的详细指南。 1. 什么是 IPv6? IPv6(Internet Protocol Version 6&#xff…

37、需求预测与库存优化 (快消品) - /供应链管理组件/fmcg-inventory-optimization

76个工业组件库示例汇总 需求预测与库存优化 (快消品) - 自定义组件 概述 这是一个用于模拟和可视化快消品 (FMCG) 需求预测与库存优化流程的组件。用户可以选择不同的产品和区域,调整预测参数和库存策略,然后运行模拟以查看历史销售、预测需求以及基…

vuex如何在js文件中使用

文章目录前言代码实现1. 导出2. 使用总结前言 vue项目中比较常用的vuex,一般是在.vue文件中使用,那如何在.js文件中使用呢? 代码实现 1. 导出 vuex-store.js: export default {state: {isLogin: false,},mutations: {updateIsLogin(stat…

ESP32开发WSL_VSCODE环境搭建

系列文章目录 ESP32开发WSL_VSCODE环境搭建 文章目录 系列文章目录 前言 一、ESP32 WSL开发环境是啥子? 二、搭建步骤 1.启用WSL功能 2.安装Ubuntu系统 2.1 微软商店下载 2.2 下载发行版 2.3 安装完成后的密码设置 3. 环境配置 3.1 更新 apt工具 3.2 安装ESP-IDF相关应用 3.3…

分布式锁设计实战:多级缓存防御设计优化同步性能

JVM层的双重检查锁(Double-Checked Locking)是一种在多线程环境下优化同步性能的设计模式,主要用于减少锁竞争和提高缓存访问效率。其核心原理如下: ‌工作流程‌ 第一次检查:线程先无锁读取缓存,若命中则直接返回数据 加锁同步:若未命中,线程进入同步代码块 第二次检查…