杰克逊正在做一些真正奇怪的事情,我找不到任何解释.我正在进行多态序列化,当一个对象独立时它可以很好地工作.但是,如果将相同的对象放入列表并对列表进行序列化,则会删除类型信息.

它丢失类型信息的事实将导致人们怀疑类型擦除.但这是在列表内容的序列化过程中发生的;杰克逊所要做的就是检查它正在序列化的当前对象以确定其类型.

我用Jackson 2.5.1创建了一个例子:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import com.fasterxml.jackson.annotation.JsonSubTypes;

import com.fasterxml.jackson.annotation.JsonSubTypes.Type;

import com.fasterxml.jackson.annotation.JsonTypeInfo;

import com.fasterxml.jackson.annotation.JsonTypeName;

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.ArrayList;

import java.util.List;

public class Test {

@JsonIgnoreProperties(ignoreUnknown = true)

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)

@JsonSubTypes({

@Type(value = Dog.class, name = "dog"),

@Type(value = Cat.class, name = "cat")})

public interface Animal {}

@JsonTypeName("dog")

public static class Dog implements Animal {

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

@JsonTypeName("cat")

public static class Cat implements Animal {

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

public static void main(String[] args) throws JsonProcessingException {

List list = new ArrayList<>();

list.add(new Cat());

System.out.println(new ObjectMapper().writeValueAsString(list));

System.out.println(new ObjectMapper().writeValueAsString(list.get(0)));

}

}

这是输出:

[{"name":null}]

{"@type":"cat","name":null}

如您所见,当对象在列表中时,Jackson不会添加类型信息.有谁知道为什么会这样?

java为什么序列化不一致_java – 为什么Jackson多态序列化在列表中不起作用?相关推荐

  1. jackson多态序列化与反序列化

    前几天遇到个问题,场景大概是 list 中既有父类又有子类,在反序列化时丢掉了子类的信息.解决这个问题也没花多少时间,不过还是打算记录下.参考链接如下: Jackson JSON - Using @J ...

  2. java list 截取部分数据_Java List.subList()方法:获取列表中指定范围的子列表

    集合类中的 List.subList() 方法用于获取列表中指定范围的子列表,该列表支持原列表所支持的所有可选操作.返回列表中指定范围的子列表. 语法: subList(int fromIndex,i ...

  3. java对象序列化克隆_JAVA 对象克隆和序列化

    先用一个例子来说明假克隆吧,也就是用"="之后的效果.. [运行结果]: [运行结果] 姓名:rollen年龄:20 姓名:hello world年龄:100 姓名:hello w ...

  4. java的继承实例_Java继承和多态实例

    我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...

  5. java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化

    一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会 ...

  6. java继承与多态性_Java继承与多态浅析

    一.继承 1.通过extends继承的父类可以是不加abstract关键字的普通类,也可以是加了abstract关键字的抽象类.继承普通类时可以覆写父类的方法,或者创建自己独有的方法,或者这两     ...

  7. java冒泡排序函数验证_java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数...

    import java.util.Arrays; public class ArrayDemo2_3 { public static void main(String []args) { //---- ...

  8. java替换图片中文字_Java 添加、替换、删除Word中的图片

    文档中,可以通过图文混排的方式来增加内容的可读性,相比纯文本文档,在内容展现方式上也更具美观性.在给文档添加图片时,可设置图片的文本环绕方式.旋转角度.图片高度/宽度等:另外,也可对文档中已有的图片实 ...

  9. java apt怎么用_java – APT和AOP在同一个项目中,使用Maven

    我显然是唯一能够回答我自己问题的人. 我已经使用Maven Antrun Plugin通过ant编译AspectJ.这是我的pom片段: maven-antrun-plugin 1.4 org.asp ...

最新文章

  1. Spark源码阅读02-Spark核心原理之作业执行原理
  2. centos 7 yum 安装 MongoDB 4.2
  3. throttle_classes 60秒访问10次限制
  4. 牛客多校9 - Groundhog Chasing Death(质因子分解+思维)
  5. python中添加路径_python中添加模块导入路径的方法
  6. 14002.petalinux编译配置项目
  7. Ubuntu 16.04 配置vsftpd使用 ssl 传输
  8. snownlp 原理_情感分析snownlp包部分核心代码理解
  9. 水晶报表教程:手把手教你制作基本报表
  10. 兼容各个浏览器的H.264播放: H.264+HTML5+FLOWPLAYER+WOWZA+RMTP
  11. 【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)
  12. 常见信息安全威胁与经典案例
  13. mysql取消安全模式
  14. [随笔] flex 布局使用 space-between 尾行排版效果优化
  15. c语言合并wav文件,如何将两个WAV文件合并/合并为一个WAV文件?
  16. 政务服务一网通办建设方案(ppt)
  17. archlinux 解决蓝牙无法连接问题
  18. LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根
  19. 金士顿固态硬盘不认盘修复_#原创新人#老司机带你玩转PC,故障之SSD篇 篇一:金士顿 V300 240G SATA3 固态硬盘 丢盘掉速解决记录...
  20. 安装过的软件使用recovery中重新安装(这里重装SuperSU)

热门文章

  1. 【转载】首次作品展小结
  2. 数组的拼接合并 numpy
  3. 解决plsql中文显示问号(???)问题
  4. Lock、ReentrantLock、ReentrantReadWriteLock原理及应用深入解析
  5. 自动驾驶与汽车安全电子技术
  6. TVM开发三个示例分析
  7. TensorFlow中的语义分割套件
  8. 2021年大数据Hadoop(八):HDFS的Shell命令行使用
  9. 2021年大数据Flink(六):Flink On Yarn模式
  10. 前后端分离nginx配置,同时解决跨域问题