0

我有两节课:

超类:

public class A
{
    public int a;

    public A(int a)
    {
        this.a = a;
    }
}

子类:

public class B extends A
{
    public B(int a)
    {
        super(a);
    }
}

我使用 Jackson 来序列化/反序列化 A 和 B 的实例。

我希望将 B 类序列化为 A。我希望这是直截了当的,因为 B 没有任何成员。但是我从杰克逊那里得到了一个例外,我发现的唯一解决方案是将 B 声明为 A 的子类型 - 我不想使用这个解决方案,因为这种方式 B 被序列化并反序列化为 B。

我的限制是我不能创建另一个类来包含 A/B(容器)。

4

1 回答 1

1

如果你有一个容器类,Jackson 应该反序列化为容器类中的类型。我已将 A 重命名为 Animal,B 重命名为 Bird。

public class Container {
  public Animal animal;

  public Container() {}

  public static class Animal {
    public Animal() {}
    public Animal(int age) {
      this.age = age;
    }
    public int age;
  }

  public static class Bird extends Animal {
    public Bird() {}
    public Bird(int age) {
      super(age);
    }
  }
}

当用 Bird 序列化 Container 对象然后反序列化它时,它将变成 Animal。

@Test
public void fromBirdToAnimal() throws IOException {
  Container one = new Container();
  one.animal = new Container.Bird(123);
  String json = new ObjectMapper().writeValueAsString(one);

  Container two = new ObjectMapper()
    .readerFor(Container.class).readValue(json);
  assertEquals(123, two.animal.age);
  assertEquals(Container.Animal.class, two.animal.getClass());
}

如果容器类是不可能的,但你知道你需要的类(你的继承树的根类),告诉ObjectMapper.readerFor可以帮助你。

@Test
public void fromBirdToAnimal() throws IOException {
  Container.Bird one = new Container.Bird(123);
  String json = new ObjectMapper().writeValueAsString(one);

  Container.Animal two = new ObjectMapper().readerFor(Container.Animal.class).readValue(json);
  assertEquals(123, two.age);
  assertEquals(Container.Animal.class, two.getClass());
}
于 2018-05-16T08:38:12.627 回答