为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Jackson 反序列化匿名抽象类?

如何使用 Jackson 反序列化匿名抽象类?

慕容3067478 2021-11-17 12:31:22
我最近开始使用 Jackson 作为朋友推荐它,所以我决定创建这个 Item 对象,以便我可以玩序列化和反序列化,尽管反序列化时抽象类发生了异常。此处列出的 Item 对象public static abstract class Item implements Saveable, Serializable, Useable {    private static final long serialVersionUID = 45612874562156L;    private final String nameId;    String name;    String description;    int value;    public Item(String name, String description, int value) {        this.name = name;        this.nameId = name;        this.description = description;        this.value = value;    }    @Override    public void use() {}    @Override    public void save(Path directory) {        save(directory, nameId, Prefix.SHOP, this);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getDescription() { return description; }    public void setDescription(String description) {        this.description = description;    }    public int getValue() {        return value;    }    public void setValue(int value) {        this.value = value;    }}在尝试通过 Google 搜索答案时,我尝试启用返回相同异常的默认类型,并尝试实现您自己的反序列化器。我真的找不到一个很好的来源来展示如何创建自己的解串器。这相信我相信它可能通过扩展 StdDeserializer 来实现你自己的解串器,但我真的不知道如何。我希望在执行时返回一个项目,Saveable.load(Paths.get("./data", "other", "shop"), "Testing", Prefix.SHOP, GiftShop.Item.class)但目前我遇到了异常。我在这个 Spock 测试中测试了所有这些如果问题是我没有创建自己的自定义反序列化器,那么关于如何实现一个的资源会很棒。我正在用 Java 10 和 Jackson 2.9.7 版编写这一切。感谢您的时间,并希望我能提供所有需要的信息。
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

问题是反序列化器不知道它应该从 JSON 字符串创建什么样的类。你传递给它的类参数是一个抽象类,你不能在 java 中实例化一个抽象类。

您必须告诉对象映射器所需类的类型。@JsonTypeInfo在 Item.class 上使用注释,它将在 JSON 字符串中存储额外的类型信息。

但遗憾的是还不够,因为匿名内部类只有一个临时的对象类型,在方法之外是看不到的,所以即使它的类型信息存储在JSON字符串中,也无法在以后恢复。

因此,您必须至少将实际类定义为内部类。您仍然需要定义如何存储类型信息。


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 237 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信