zoukankan      html  css  js  c++  java
  • jackson使用setDateFormat后反序列化错误

    最近marketing-activity系统在接入降级服务,出现启动时可以正确获取到降级配置,系统运行一段时间后修改降级策略不生效的问题,之前订单系统,用户系统和其他系统的接入都没问题出现这个问题,肯定是触发了某种特定的case。营销的同学联系我进行排查,排查日志发现是降级服务反序列化Date类型异常,接收到的数据格式是yyyy-MM-dd HH:mm:ss,并不在jackson支持的反序列化格式之内。降级服务的sdk也是使用的jackson进行序列化的,为什么会出现jackson序列化后的数据却不能使用jackson反序列化。
    接着查看marketing-activity系统的降级服务sdk日志发现一个很诡异的现象,最初发送的序列化后的请求还是时间戳格式的,运行一段时间后就变成了yyyy-MM-dd HH:mm:ss格式,也就是说系统的行为在运行时被改变了。

    那么到底是什么可以改变系统运行时的序列化逻辑呢?可能出现的主要原因有2种。一种是字节码技术,也就是btrace,greys这些。另一种就是调用jackson本身的api改变了一些属性。显然第二种的可能性更大一些,果然在jsonUitl里发现了蛛丝马迹,toObject允许设置特定的时间格式进行反序列化,调用setDateFormat会导致后续全部的Date类型的序列化都会是yyyy-MM-dd HH:mm:ss格式,自然不能默认设置的jackson反序列化。

    至此降级服务改变策略后不生效的根本原因就得到了解答,那么如果某个对象就是要使用yyyy-MM-dd HH:mm:ss 进行序列化和反序列化怎么办,建议使用@JsonFormat 单独对属性进行注释。
    最后谈谈fastjson和jackson,貌似jackson的各种坑遇到过很多,而fastjson的坑很少,那么为什么jackson还是要比fastjson更流行,真的只是国外的月亮更圆,空气更甜?这个主要是json框架的设计理念偏重点不同,fastjson偏重的是简单和快速,内部实现有很多的hack和magic code。而jackson偏重的是标准和强大,格式支持json,xml,有很多的属性可以设置非常的灵活,也有很多的接口可以自定义进行扩展,导致学习成本比较高,需要详细看过jackson文档才能上手。

  • 相关阅读:
    4、提取看似无用的委托变量,减少构造开销
    Cloud Foundry buildpack
    mysql中engine=innodb和engine=myisam的区别
    Maven中dependencyManagement的作用
    bean
    servlet
    web服务器 应用服务器区别 web框架
    Java和Python的Web开发
    spring mvc controller 高并发问题
    es 批量添加数据
  • 原文地址:https://www.cnblogs.com/minotaursu/p/8085935.html
Copyright © 2011-2022 走看看