欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 人文社科 > 生活经验 >内容正文

生活经验

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

发布时间:2023/11/27 生活经验 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java为什么序列化不一致_java – 为什么Jackson多态序列化在列表中不起作用? 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

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

我用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多态序列化在列表中不起作用?的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。