Gson枚举因重新启动应用程序而丢失值

wz1wpwve  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(175)

我正在开发一款游戏,在玩的时候会有一些效果

public enum Effect {
    DoublePoints(),
    IncreaseSwitch(),
    ShowOne(),
    ShowSame();

    @SerializedName("stored")
    int stored;
    @SerializedName("leftTime")
    int leftTime;

    Effect() {

    }

    public int getStored() {
        return stored;
    }

    public void setStored(int stored) {
        this.stored = stored;
    }

    public int getLeftTime() {
        return leftTime;
    }

    public void setLeftTime(int leftTime) {
        this.leftTime = leftTime;
    }
}

stored i检查我具有的效果的计数,并且leftTime是直到效果结束的时间。
为了有效地读取和写入,我使用HashMap在运行时处理效果

private Map<String, EnumCollection.Effect> gameEffects = new HashMap<>();

并将其存储为数据库中的String
现在我用Gson来解析效果 * 从字符串 * 通过游戏的初始化和 * 到字符串 * 通过保存。

// read
public void setEffects() {
    if (game.getEffects() == null) {
        gameEffects.put(EnumCollection.Effect.DoublePoints.toString(), EnumCollection.Effect.DoublePoints);

        EnumCollection.Effect switchEffect = EnumCollection.Effect.IncreaseSwitch;
        switchEffect.setLeftTime(3);
        gameEffects.put(EnumCollection.Effect.IncreaseSwitch.toString(), switchEffect);
        gameEffects.put(EnumCollection.Effect.ShowOne.toString(), EnumCollection.Effect.ShowOne);
        gameEffects.put(EnumCollection.Effect.ShowSame.toString(), EnumCollection.Effect.ShowSame);
    } else {
        Type collectionType = new TypeToken<HashMap<String, EnumCollection.Effect>>() {
        }.getType();
        gameEffects = new Gson().fromJson(game.getEffects(), collectionType);
    }
}

// write
private void saveGameValues() {
    String effectsString = new Gson().toJson(gameEffects);
    ...
}

现在就去
我可以成功地关闭和打开应用程序。数据写入和读取成功的数据库。
通过重新打开应用程序,我得到了我所期望的 storedleftTime 值。
"但是...“
一旦我使用Android Studio重新运行按钮 * 重新启动 * 应用程序,storedleftTime 为0。
当记录字符串接收到的影响时:

effects: {"ShowSame":"ShowSame","DoublePoints":"DoublePoints","ShowOne":"ShowOne","IncreaseSwitch":"IncreaseSwitch"}

对于@SerializedName,是否应存储值?
我错过了什么?
难道是TypeToken有什么问题?

kxe2p93d

kxe2p93d1#

通过从enumObject求解

public class EffectItem {

    int stored;
    int leftTime;

    public int getStored() {
        return stored;
    }

    public void setStored(int stored) {
        this.stored = stored;
    }

    public int getLeftTime() {
        return leftTime;
    }

    public void setLeftTime(int leftTime) {
        this.leftTime = leftTime;
    }
}

从那

Type collectionType = new TypeToken<HashMap<String, EffectItem>>() {
}.getType();
gameEffects = new Gson().fromJson(game.getEffects(), collectionType);

工作正常。HashMap

private Map<String, EffectItem> gameEffects = new HashMap<>();

仍然可以用来更好地获得效果

相关问题