在将一个对象序列化过程中,引用对象的处理是一个常见问题。
随着新版本XBlink的即将推出,这个老大难问题就需要慎重解决。
在0.7.0版中,引用虽然已经能够正确处理,但是实现方式是采用了对象出现先后顺序为标记,采用数字的方式来实现引用。
例如 A包含B,B包含C,C包含A,C也包含B。生成的XML如下:
<A>
<B>
<C>
<A ref="1"/><!-- A是第一个序列化的对象,ID设置为1 -->
<B ref="2"/><!-- B是第二个序列化的对象,ID设置为2 -->
</C>
</B>
</A>
这个摸样虽然没错,但是在难以阅读。(毕竟序列化为XML的优点之一就是其可读性好,如果不好,那还不如用其他格式)
新版本的开发决定彻底解决这个问题,让引用路径可以清楚表示出其对象位置。
思考后,解决方式就是生成常见的两种路径:相对路径 绝对路径
在这个实现过程中,看了下Fastjson与XStream的实现方式,发现以下几点问题:
首先说说温少的Fastjson的实现方式
这里有温少的一个思路和最终实现。
这里的路径感觉有稍许混乱,有的是相对路径,例如使用..来引用上级对象,但也有几个特殊符号,使得有的路径又变成了绝对路径,例如使用对于根节点使用$来表示,自身使用@来表示。
个人认为这样会产生一个问题,例如上面那个ABC的例子,可以有两种表现形式
<A>
<B>
<C>
<A ref="$"/>
<B ref="../.."/>
</C>
</B>
</A>
<!-- 下面这种也是正确的 -->
<A>
<B>
<C>
<A ref="../../.."/>
<B ref="$.B"/>
</C>
</B>
</A>
像例子中关于B节点就有两种不同的表示方式,一个文件中会混杂这两种格式,这就是个人觉得有稍许混乱的原因。
代码的话查看com.alibaba.fastjson.serializer.SerialContext
还有com.alibaba.fastjson.serializer.JSONSerializer的writeReference方法
里面实现是优先判断是否属于那几个特殊符号使用范围,不行再计算路径。
路径是通过一个链表形式存放的,不断查找父节点,拼装路径,具体的还是看源码吧。
再谈谈XStream的实现方式
XStream采用了常见的相对路径来表示位置关系(个人比较喜欢这个)。
代码看com.thoughtworks.xstream.io.path包。
简单分析下几个类的作用:
Path 就是封装路径用的对象,里面有着计算相对路径的方法。
PathTracker 名字都告诉你了,Tracker!里面有一个栈,进去一个节点,把节点名称压入栈中,退出这个节点,弾栈,也就是说记录当前路径信息,通过它可以获得你当前所在节点的绝对路径。
PathTrackingWriter 一个包装类,里面实际工作的是HierarchicalStreamWriter也就是用来写XML文件的,在写节点开始标签时,调用PathTracker记录那个节点名称,写节点结束标签时,再调用PathTracker 删掉那个节点名称。
PathTrackingReader 与PathTrackingWriter 功能类似,反序列时用的。
最后说下XBlink的实现思路,其实跟XStream差不多,基本就是参考它的,做了一些简化与改进。
详情见org.xblink.core.path包(里面几个类也是借鉴了XStream,哈哈,谁叫XStream是XBlink的老师来)
讲下思路,首先在开始写XML时,生成一个PathTracker实例。
实现一个引用缓存,例如一个key是对象,value是绝对路径的Map,用来记录对象与其绝对路径的关系。
首先一个对象序列化,先去这个缓存查看一下,是否已经存在了,如果没有,那就开始写一个节点,记录下这个节点名称,放入PathTracker中。当你发现有个节点是可以被引用的(可能被引用,后面是不是真的被引用还不知道),就通过PathTracker生成当前这个节点的绝对路径,将这个类与路径记录引用缓存中,然后序列化下一个对象。
当发现要某个对象是要在缓存中存在的了,那就生成当前路径(也是一个绝对路径),通过一个算法,将此路径与缓存中那个对象的绝对路径进行比较,生成相对路径。
在代码上如果变通一下的话,你可以设置一个开关,关于引用是采用相对路径还是绝对路径(这两者你都可以拿到)
这样不但你让用户多了一个选择(更人性化),如果使用绝对路径,还能减少一次计算路径的开销,提高了效率。
以上就是一些个人想法,欢迎大家提出意见探讨。
分享到:
相关推荐
* 任意你想要的文档格式名称,例如JSON或者XML * @return 对象 */ public static Object fromAny(CharSequence cs, String docTypeName) { return XBlinkHelper.fromAny(IOUtil.createReader(cs), ...
雷赛运动底层源码兼容性升级:品牌间无缝对接与高效运动性能保障,雷赛运动底层源码可交其他品牌正运动,固高源码 ,核心关键词:雷赛运动底层源码; 正运动品牌交换; 固高源码; 运动控制源码。,"雷赛与正运动固高源码互通,运动控制底层源码灵活可换"
MATLAB仿真及应用练习
C#工业互联网云服务器框架:高性能Web API与MQTT集成,带移动设备测试demo及多种协议支持(包括EF6+数据库扩展、无IIS依赖),c# 工业互联网云服务器框架。 集成web api服务,可选集成mqtt服务器及其它服务器,这套带码是通过C#编写集成IOCP高性能高并发优势服务器服务源码。 带手机app测试demo源码 具体具备功能如下: 1、具备EF6+mssql数据库功能,可更改为MYSQL或SQLITe. 2、自带WEB API服务,抛弃IIS支持。 用户可以通过WEB前端直接读取远程设备数据以及下发控制指令。 WEB API功能有服务器日志查询、WEB API接口认证用户管理、远端设备注册管理、服务器轮询读取任务启停、服务器参数设置、查询历史数据记录、下发指令到终端设备。 3、系统目前支持modbus 、modbus rtu协议,可定制开发集成Modbus TCp、西门子PLC S7协议、OPC协议、三菱PLC协议以及集成MQTT服务(以上协议在框架中没有集成,可以定制集成)。 4、系统自带MVC服务,开发API像平常使用的一样方便。 另外它自带硬件协议驱动。 5、与
80W高PF值可调电源方案:适用于LED驱动与笔记本充电,满足安规与EMC标准,附详细资料,80W可调高PF电源方案 高功率因数(高PF值) 符合安规要求,可过EMC家电标准。 主要应用于:LED驱动(无频闪),笔记本充电器。 等 输入100~。 输出可调。 资料: PCB文件(AD,99) 原理图 BOM单 散热片图纸 主副变压器图纸 ,核心关键词:可调高PF电源方案; 80W功率; 符合安规与EMC标准; LED驱动; 笔记本充电器; PCB文件; 原理图; BOM单; 散热片图纸; 主副变压器图纸。,"可调高功率因数电源方案:80W LED驱动与笔记本充电器必备"
锂电池管理系统中的选择性放电与可重构式均衡(旁路开关技术与均衡仿真),锂电池均衡仿真 电池管理系统 选择性放电 可重构式均衡(旁路开关) ,核心关键词:锂电池均衡仿真; 电池管理系统; 选择性放电; 可重构式均衡(旁路开关)。,"基于选择性放电策略的锂电池均衡仿真及可重构式均衡管理系统研究"
基于分层调度方法的分布式电动汽车协同调度算法研究——结合线性规划与二阶锥优化方法的MATLAB实现,分布式和电动汽车协同调度matlab 采用分层调度方法,采用线性规划和二阶锥方法实现分布式和电动汽车协同调度,程序运行稳定,有详细的参考资料 ,核心关键词:分布式; 电动汽车; 协同调度; MATLAB; 分层调度方法; 线性规划; 二阶锥方法; 程序稳定性; 详细参考资料。,基于Matlab的电动汽车与分布式系统协同调度策略:分层调度与优化算法
基于三菱PLC与组态王技术的鸡舍温湿度智能控制系统,基于三菱PLC和组态王鸡舍温湿度控制养鸡场 ,核心关键词:三菱PLC; 组态王; 鸡舍温湿度控制; 养鸡场。,基于三菱PLC与组态王鸡舍温湿度智能控制养鸡场方案
"某特种电机Maxwell与Simplorer联合仿真性能探究:波形分析揭示内在性能",某特种电机Maxwell+Simplorer联合仿真及其性能波形 ,核心关键词:Maxwell; Simplorer联合仿真; 特种电机; 性能波形;,"Maxwell与Simplorer联合仿真:特种电机性能波形解析"
智慧档案馆建设方案旨在通过先进的信息技术和智能化手段,全面提升档案管理的效率和安全性,满足现代档案管理的需求。方案涵盖了软件、硬件、网络及安全、分布式存储、数据保护、机房建设等多个方面,确保档案馆在数字化、智能化转型中具备高效、安全、可扩展的能力。 在软件部分,智慧档案馆平台集成了档案接收、管理、保存、智能库房管理、辅助鉴定、编研、统计、内部利用、电子阅览室智能服务等功能模块。通过智能化的档案接收和管理流程,系统能够高效处理各类档案数据,支持历史数据迁移、数字化成果接收、征集档案接收等操作。智能库房管理模块通过虚拟库房、调卷归卷管理、温湿度管理等功能,确保实体档案的安全保管和高效利用。此外,系统还提供了智能辅助鉴定、编研、统计等功能,帮助档案馆实现档案的智能化管理和利用。 硬件部分则包括网络及安全设备、分布式存储、数据保护一体机、离线备份设备、机房建设等。网络及安全设备如核心交换机、汇聚交换机、下一代防火墙、终端安全管理系统等,确保了档案馆网络的高效运行和数据的安全防护。分布式存储系统通过全分布式架构和数据冗余技术,提供了高可伸缩性和高可用性,支持多副本或EC冗余机制,确保数据的安全性和快速重构。数据保护一体机和离线备份设备则通过多种备份和恢复机制,确保数据的完整性和可恢复性。机房建设部分则通过UPS、精密配电柜、精密空调、冷通道机柜等设备,确保机房的稳定运行和高效管理。 智慧档案馆建设方案不仅顺应了国家档案信息化建设的政策要求,还结合了云计算、区块链等新技术,确保了系统的先进性和安全性。通过智能化的档案管理和高效的数据保护机制,档案馆能够更好地服务于公众,提升档案利用效率,实现档案资源的共建共享。这一方案不仅是档案数字化转型的重要举措,也为未来档案馆的智能化发展奠定了坚实基础。
基于dsp28335的CAN升级方案及自主开发BootLoader与上位机流程说明,基于dsp28335的can升级方案 bootloader、上位机等全部自主开发 文件说明: 1、setup为上位机安装文件; 2、V5为dsp28335的BootLoader源代码,我用的CCS10.3.1; 3、WindowsApplication3为VS平台的上位机源代码,我用的VS2013; 4、app.bin为测试用的app烧录固件。 5、F28335_FLASH_COM_V1为app代码参考的cmd文件。 使用ZLG的USBCAN-II。如果是别家的盒子,看他是否给了兼容周力功的方法,按照那个方法操作上位机就可以 操作流程: 1、先连接好CAN盒和DSP(不上电),打开上位机(默认的设置,不要修改任何选项)。 2、点击“连接”,再点击“启动”。 3、打开目标bin文件。 4、DSP上电,3S内电机“更新固件”。 5、等待完成烧录,程序自动跳转到APP中。 注意: 1、如果DSP上电后,3秒内未收到ID:0x00001342发来的数据,则自动跳转到APP中; 2、如果上位机已经打开了
联邦管理系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
ERP与MES系统源代码:WPF开发AGV上位机执行系统,集成SQL数据库技术、多线程技术及应用在工业组态的智能化开发,ERP MES 两套系统源代码 WPF AGV C# WPF开发。 A,WPF MES 上位机产线执行系统。 1, 完整纯源代码; 2, AGV自动调度; 3, SQLSERVER数据库。 带附加文件。 4, WPF各种技术应用。 5, 数据库技术应用。 6, DTU数据传输。 7, TCP IP SOCKET技术应用。 8, EXCEL数据查询与导出。 9, 各种库位的管理。 10,重要是多线程技术应用。 B,WPF工业组态。 1, 智能化工业组态。 2, WPF下的OPC开发。 3, 多链接plc下的工业开发。 4, 数据库的应用。 5, 各种典型WPF页面开发。 ,关键词:ERP; MES; WPF源代码; AGV; C#开发; SQLSERVER数据库; 完整纯源代码; AGV自动调度; 数据库技术应用; DTU数据传输; TCP IP SOCKET技术; EXCEL数据查询与导出; 各种库位管理; 多线程技术; WPF工业组态; 智能化工业组态; OPC开
西门子PLC Smart200锁机与Smart700IE V3程序配套:分期付款、动态验证码、无限次加密程序实例探究,PLC 西门子smart200 锁机 配对应西门子smart700IE V3程序,分期期付款 动态验证码,无限次加密 程序例程 ,核心关键词:西门子smart200; PLC; 锁机; 配对应; 西门子smart700IE V3程序; 分期付款; 动态验证码; 无限次加密; 程序例程。,西门子PLC Smart系列:Smart200锁机与Smart700IE V3程序匹配指南
基于Modbus RTU和TCP/IP协议的LABVIEW上位机数据展示与PLC通讯程序,LABVIEW上位机数据显示程序 本程序具有的功能包括: 1.采用的通讯协议modbus rtu,tcpip ,vmic闪存卡 2.具有故障报警功能 3.主要是与PLC进行通讯,如果支持以上协议的设备也可以通讯。 4.显示界面设计合理,可以借鉴。 本项目难点在于通讯,以及显示量过多,界面排版问题。 程序都有标注,不理解的可以指导。 ,关键词:LABVIEW上位机;数据显示程序;通讯协议;modbus rtu;tcpip;vmic闪存卡;故障报警;PLC通讯;显示界面设计;界面排版。,"Modbus RTU与TCP/IP通讯的LABVIEW上位机数据展示程序:故障报警与界面优化"
"著名车企汽车级平台主控芯片与电机控制器源码揭秘:卓越代码风格一览",著名车企汽车级平台主控芯片,电机控制器源码 ,代码风格极好 ,核心关键词:著名车企;汽车级平台主控芯片;电机控制器源码;代码风格极好;,"著名车企主控芯片源码揭秘:电机控制器代码风格卓越"
RT-Thread内核实现与应用开发实战——基于STM_ (Z-Library)
本代码是基于python pytorch环境安装的。 可参考博文进行安装环境运行代码-但需要先自行收集好图片放到对应文件夹下: https://blog.csdn.net/no_work/article/details/139246467 首先是代码的整体介绍 总共是3个py文件,十分的简便 本代码是不含数据集图片的,下载本代码后需要自行搜集图片放到对应的文件夹下即可 需要我们往每个文件夹下搜集来图片放到对应文件夹下,每个对应的文件夹里面也有一张提示图,提示图片放的位置 然后我们需要将搜集来的图片,直接放到对应的文件夹下,就可以对代码进行训练了。 运行01生成txt.py,是将数据集文件夹下的图片路径和对应的标签生成txt格式,划分了训练集和验证集 运行02CNN训练数据集.py,会自动读取txt文本内的内容进行训练,这里是适配了数据集的分类文件夹个数,即使增加了分类文件夹,也不需要修改代码即可训练 训练过程中会有训练进度条,可以查看大概训练的时长,每个epoch训练完后会显示准确率和损失值 训练结束后,会保存log日志,记录每个epoch的准确率和损失值 最后训练的模型会保
LabVIEW中英文虚拟键盘源程序:支持数字、字母、汉字输入,XP与Win7系统下的输入法检测与切换,触摸屏便捷操作及输入法名称的查看与修改,LabVIEW中英文键盘源程序 可输入数字、字母、汉字,能在 XP系统和Win7系统下检测并切电脑里安装的输入法。 在使用触摸屏电脑的时候可方便的输入所需内容。 有些输入法不同版本对应的编号不一样,可在程序里查看、修改界面显示的输入法名称。 ,LabVIEW; 虚拟键盘源程序; 数字字母汉字输入; 跨系统兼容(XP/Win7); 输入法检测与切换; 触摸屏电脑输入; 输入法名称查看与修改。,LabVIEW多语言虚拟键盘源程序:跨系统输入法切换与显示管理