在将一个对象序列化过程中,引用对象的处理是一个常见问题。
随着新版本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), ...
实训商业源码-咻一咻抽奖V4.3.1 开源版-毕业设计.zip
有线网调试demo源码和apk.zip 有线网demo 的简单说明: 1、Android 原生没有有线网开关状态,需要自定义属性进行开关记忆;所以默认没设置switch开关控件; 2、有线网开关状态之前方案都是使用Settings.Global.ethernet 开关记录的,3588 AN15 使用的是prop属性记录; 3、静态ip设置:要和自动获取的ip在同一个网段;网关一般设置成X.X.X.1,设置错误会导致无法上网; 4、代理设置:端口号有范围:1-65535,以前好像遇到过311D2 wifi设置端口号范围超出数值会导致系统重启。 5、有些方案设置静态ip或者代理需要关开一次有线网才能生效。 6、有线网接入状态是导入了定制包的,只针对特定系统,其他系统不适用,直接使用估计会崩溃, 其他系统调试需要去除判断有线网接入部分代码,重新编译apk使用; 底层是如何实现判断有线网接入的,没有去研究分析,大概是通过io是否接入判断的。
实训商业源码-掌上题库V1.2.2全开源版本-毕业设计.zip
实训商业源码-梦昂图文10.2.14 公众号版-毕业设计.zip
985研究生,Matlab领域优质创作者 (1)如需代码 加腾讯企鹅号,见评论区或私信; (2)代码运行版本 Matlab 2019b (3)其他仿真咨询 1 完整代码包运行+运行有问题可咨询 2 期刊或论文复现; 3 程序定制; 4 期刊写作或指导; 5 科研合作;
毕业论文-二次元应用下载页源码 带弹幕-整站商业源码.zip
毕业论文-老虎-微信淘宝客V6.0.7-整站商业源码.zip
毕业论文-方熊表单V1.0.0 开源版-整站商业源码.zip
基于深度学习图像分割Unet的肿瘤区域识别辅助诊断系统的Python源码及全部数据(高分项目)。该项目经导师指导并认可,获得98分,适合计算机相关专业学生进行课程设计、期末大作业或项目实战练习。。内容来源于网络分享,如有侵权请联系我删除。
内容概要 本文介绍了一个用 Python 编写的微信自动回复程序。通过安装特定依赖,配置config.xlsx文件中的关键词和回复内容,运行auto_reply.py程序,即可实现微信自动回复功能。程序会持续监测微信新消息,满足特定条件时,依据关键词匹配回复内容进行自动回复。 适用人群 适合微信消息较多,希望节省回复时间的人群,尤其是经常被重复性消息打扰的办公族、客服人员等,也适合对 Python 编程感兴趣,想要尝试开发简单自动化工具的初学者。 使用场景及目标 在工作场景中,能自动回复常见问题,提高沟通效率;生活里,可快速回应亲友的常用问候,避免遗漏消息。目标是减少手动回复的繁琐,解放双手,让信息处理更高效。 其他说明 运行前需确保正确安装依赖,可修改config.xlsx来自定义回复规则。运行程序后,按Ctrl+C可停止。若遇到问题,可从依赖安装、文件配置等方面排查。
实训商业源码-全新开源贫穷网打赏源码-毕业设计.zip
实训商业源码-智云物业2.3.9-毕业设计.zip
CAD技术在农业机械工程设计中的运用研究.pdf
内容概要:本文介绍了Dify——一个用于开发大型语言模型(LLM)应用程序的开源平台。Dify融合了后端即服务(BaaS)和LLMOps理念,使开发者能快速构建生产级别的生成式AI应用。它支持多种LLM模型,包括GPT、Mistral、Llama3等,并兼容多种推理提供商。Dify内置了高质量的检索增强生成(RAG)引擎和灵活的Agent框架,支持聊天助手、文本生成、Agent应用和工作流等多种应用类型。通过丰富的功能组件,如数据集管理、可视化Prompt编排、应用运营工具和插件生态系统,Dify极大简化了AI应用的开发过程。文章还展示了Dify在电商智能客服、新媒体内容生成和企业办公自动化等实际场景中的应用案例,并与FastGPT进行了对比,突出了Dify在模型接入、应用构建和用户友好度等方面的优势。 适合人群:对AI应用开发感兴趣的研发人员,尤其是希望快速构建和部署AI应用的开发者和企业。 使用场景及目标:①通过Dify的强大模型支持和RAG引擎,快速构建智能客服、内容生成等AI应用;②利用Agent框架和工作流功能,实现复杂任务的自动化处理;③通过丰富的功能组件和插件生态系统,提升应用的灵活性和功能性。 其他说明:Dify不仅提供了便捷的安装和使用指南,还展望了未来的发展前景,强调其在降低AI应用开发门槛和推动AI技术创新方面的巨大潜力。
实训商业源码-深蓝AI智能名片小程序1.7.1-毕业设计.zip
【研华科技】以数智融合打造可持续管理的企业未来.pdf
“平台+生态”打造产业数字化新引擎.pdf
实训商业源码-柚子社区团购 1.3.17-毕业设计.zip