• 对于有子父类继承关系的java类,子父类序列化和反序列化经常容易报错
    • 报错情况举例:子类序列化,用父类的class进行反序列化
    • 原因:反序列化的时候,不清楚具体的类型信息
    • 解决:jackson允许配置多态类型处理,通过给类配置注解,添加类型信息,可以使得多态的序列化和反序列化正常运行。
    • 一般由 JsonTypeInfoJsonTypeInfo 配合使用

      1. public @interface JsonTypeInfo {
      2. //定义使用哪一种类型识别码,可选值在枚举中
      3. JsonTypeInfo.Id use();
      4. //可选,指定识别码是如何被包含进去的,可选值在As枚举中
      5. JsonTypeInfo.As include() default JsonTypeInfo.As.PROPERTY;
      6. //可选,指定识别码的属性名称
      7. String property() default "";
      8. Class<?> defaultImpl() default JsonTypeInfo.class;
      9. boolean visible() default false;
      10. /** @deprecated */
      11. @Deprecated
      12. public abstract static class None {
      13. public None() {
      14. }
      15. }
      16. public static enum As {
      17. PROPERTY,//作为数据的兄弟属性
      18. WRAPPER_OBJECT,//作为一个包装的对象
      19. WRAPPER_ARRAY,//作为一个包装的数组
      20. EXTERNAL_PROPERTY,//作为扩展属性
      21. EXISTING_PROPERTY;//作为POJO中已经存在的属性
      22. private As() {
      23. }
      24. }
      25. //类型识别码的可选值
      26. public static enum Id {
      27. //不使用识别码
      28. NONE((String)null),
      29. //使用完全限定类名做识别
      30. CLASS("@class"),
      31. //若基类和子类在同一包类,使用类名(忽略包名)作为识别码
      32. MINIMAL_CLASS("@c"),
      33. //一个合乎逻辑的指定名称
      34. NAME("@type"),
      35. //自定义识别码
      36. CUSTOM((String)null);
      37. private final String _defaultPropertyName;
      38. private Id(String defProp) {
      39. this._defaultPropertyName = defProp;
      40. }
      41. public String getDefaultPropertyName() {
      42. return this._defaultPropertyName;
      43. }
      44. }