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

我最近开始使用 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 版编写这一切。感谢您的时间,并希望我能提供所有需要的信息。


慕容3067478
浏览 246回答 1
1回答

不负相思意

问题是反序列化器不知道它应该从 JSON 字符串创建什么样的类。你传递给它的类参数是一个抽象类,你不能在 java 中实例化一个抽象类。您必须告诉对象映射器所需类的类型。@JsonTypeInfo在 Item.class 上使用注释,它将在 JSON 字符串中存储额外的类型信息。但遗憾的是还不够,因为匿名内部类只有一个临时的对象类型,在方法之外是看不到的,所以即使它的类型信息存储在JSON字符串中,也无法在以后恢复。因此,您必须至少将实际类定义为内部类。您仍然需要定义如何存储类型信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java