繁体   English   中英

序列化后在超类列表中强制转换继承的类

[英]Casting inherited class in List of Superclass after Serialization

我目前正在与几个同学一起开发一个Android游戏。 这是带有纸牌等的棋盘游戏的改编。 我们有一个服务器和一个客户端,通讯可以通过Spring Boot进行。

我面临有关列表元素的转换的问题。 我们有一个卡组(ArrayList <Card>),并且有多种类型的卡,比如说子弹卡(枪中还留有不同的子弹)和子弹卡。 BulletCard和ShootCard都继承自Card。

如果将卡添加到ArrayList <Card>中,则可以在服务器端无问题地将它们强制转换回其继承的类。 但是,如果客户端获取的是ArrayList,则无法进行强制转换,因为我丢失了子类的信息(示例中的bulletcounter)。

有没有办法我也可以传输这些数据?

ArrayList<Card> handcardDeck= new ArrayList<>();

handcardDeck.add(new ShootCard());
BulletCard bulletCard = new BulletCard();
bulletCard.setBulletCounter(3);
handcardDeck.add(bulletCard);

ShootCard s = (ShootCard) handcardDeck.get(0);
BulletCard b = (BulletCard) handcardDeck.get(1);
Integer i = b.getBulletCounter();

剩余输出看起来像这样:

 "cards": [
      {
        "id": 26
      },
      {
        "id": 28
      },
      {
        "id": 29
      },
      {
        "id": 32
      }

如果我创建一个“纯”的bulletsdeck(ArrayList <BulletCard>),我会得到这个。

    "cards": [
      {
        "id": 17,
        "bulletCounter": 1
      },
      {
        "id": 18,
        "bulletCounter": 2
      },
      {
        "id": 19,
        "bulletCounter": 3
      }]

我能以某种方式获得#1列表中所有子弹卡的#2输出吗?

所以我找到了解决方案:

在父类中定义@JsonTypeInfo和@JsonSubTypes可以达到目的。

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

@Entity
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
@JsonSubTypes({
        @JsonSubTypes.Type(ShootCard.class),
        @JsonSubTypes.Type(BulletCard.class)
})

public class Card implements Serializable {}

http://www.studytrails.com/java/json/java-jackson-Serialization-polymorphism.jsp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM