所以我又尝试着换一种 JSON 库去处理这个命名问题 。先试一试阿里的 FastJSON 。看看这个国产库的处理怎么样:
{"cTitle":"Effective JAVA","nId":1}看到这个序列化结果时 。我差点把我键盘按钮上面的 Backspace 按断了……一样是通过 getter 方法解析属性名 。两个库的解析规则还能不一样……
在 FastJson 里 。c 是小写了 。可 Title 里的 T 还是大写 。@#¥%……&此处省略100字……
冷静一下之后 。心里默念了几遍:“不怪别人 。是咱们自己的命名问题 。不符合标准人家怎么解析都不关你事……”
不过 JAVA 的生态这么好 。JSON 库也不止这两个 。再换一个就是 。Google 的 Gson 也很不错嘛!
Gson 的匈牙利命名法于是我又换成了 Gson 。配置完 Spring MVC Gson Converter 之后 。输出结果:{"NId":1,"CTitle":"Effective JAVA"}终于换到一个能正常显示原始字段名的 JSON 库了 。不过它既然能保持原有字段名 。而不是 getter 里解析的属性名 。那么它肯定不是解析 getter 方法名的
于是我又去翻了下 Gson 的源码 。发现它是直接 getDeclaredFields() 。然后makeAccessible 。最后直接通过 Field.getValue的方式直接获取属性值的 。
相比 Jackson 和 FastJson 里通过 getter 获取属性列表 。然后通过调用 getter 方法来获取属性值的方法来探讨 。强烈访问私有属性这种做法还是太暴力了 。不过我喜欢 。至少它能轻松解决了我的问题
其他的序列化问题除了 JSON 这种文本形式的序列化之外 。一些二进制的序列化也会有这个尴尬的问题 。获取属性列表/属性值 。到底是用解析 getter 方法的方式 。还是直接 makeAccessible 暴力访问私有属性呢?
这个我测试了一下 。比如在 Dubbo 的默认序列化方式(Dubbo 简化的Hession2)中 。仍然是 getDeclaredFields 。然后访问私有属性
在 JDK 的内置序列化 ObjectOutputStream 中 。也是 getDeclaredFields 。然后访问私有属性 。
不过这种 getDeclaredFields。然后访问私有属性值的方式 。也会有一些劣势 。比如在接触代码混淆时 。私有属性的值会被全部打乱 。而 public 的方法却不会 。所以在接触混淆的代码时 。这种方式就会乱套了 。而通过 getter 方法解析的方式就不会有问题 。
所以吧 。这个获取属性的方式并没有对错 。怎么都可以 。不过我认为还是应该通过 getter/setter 的方式来操作 。符合 JAVA 的规范 。
总结Java 里访问私有属性值 。标准的方式是通过 getter 方法 。但还是提供了一个 makeAccessible 操作 。可以让咱们直接访问私有属性或者私有方法 。
一直不太明白 JDK 为什么要这么设计 。既然已经指定了规范 。为什么还要开个后门呢?如果限制死了这个功能 。那么所有序列化的库不就可以统一了 。再也没有这种让人作呕的不一致问题!
但对比以上三个序列化库 。我觉得都没错 。Jackson/FastJson 遵从规范的方式来 。老老实实地通过 getter 方法来获取 。而 Gson 就有点暴力 。直接访问私有属性 。各有优势 。
【匈牙利命名法为何被淘汰 匈牙利命名规则标识符】介绍浏览:Google一面挂 。疯刷1000道JAVA面试题 。上岸华为
- 新鲜山楂怎么吃最好
- 庄家洗盘的手法怎么能判断出来?
- 庄家洗盘的方法有哪些,如何判断股票洗盘结束的起爆点?
- 主力洗盘和出货太像,有哪些有效识别的办法?
- 暴涨牛股拉升前洗盘常见手法有哪些?K线特征是什么?
- 号称“日本精锐”的关东军,为什么无法抵挡苏联军队的进攻?
- 花样直播怎么赚钱?花样直播app赚钱方法
- 泡绿茶的正确方法
- 王者荣耀四周年皮肤联动越剧,英雄确定是个法刺,凤求凰将以另一种方式返场,你怎么看?
- 真假蜂蜜的鉴别方法
