首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity -将新变量添加到二进制格式的保存数据?

Unity -将新变量添加到二进制格式的保存数据?
EN

Stack Overflow用户
提问于 2019-07-30 20:48:57
回答 1查看 371关注 0票数 0

我使用二进制格式化程序保存用户数据,其中包括一堆嵌套的类和参数。当我需要向任何类添加新参数时,游戏会加载损坏的数据/对于来自以前版本的用户根本没有数据。

我尝试在加载后检查新变量,如果默认数据为空但不能修复,则从默认数据复制。游戏不会崩溃,但用户数据中的所有价格和关卡都会丢失。

代码语言:javascript
复制
public void Load()
{
    GameData = new GameDataModel();

    if (File.Exists(GameFilePath + "/" + GameFileName))
    {
        var bf = new BinaryFormatter();
        var file = File.Open(GameFilePath + "/" + GameFileName, FileMode.Open);
        var gameData = (GameDataModel)bf.Deserialize(file);
        file.Close();

        if (string.IsNullOrEmpty(gameData.WorldName))
        {
            GameData = CreateDefaultGameData();
        }
        else
        {
            GameData = gameData;
        }
    }
    else
    {
        GameData = CreateDefaultGameData();
    }

    for (int i = 0; i < GameData.Cities.Count; i++)
    {
        if (GameData.Cities[i].FoodStall == null)
            GameData.Cities[i].FoodStall = CreateDefaultGameData().Cities[i].FoodStall;
        if (GameData.Cities[i].Billboard == null)
            GameData.Cities[i].Billboard = CreateDefaultGameData().Cities[i].Billboard;
        if (GameData.Cities[i].Trees == null)
            GameData.Cities[i].Trees = CreateDefaultGameData().Cities[i].Trees;
        if (GameData.Cities[i].Decorations == null)
            GameData.Cities[i].Decorations = CreateDefaultGameData().Cities[i].Decorations;
        if (GameData.Cities[i].Station.StationBuildingTypeCosts == null)
            GameData.Cities[i].Station.StationBuildingTypeCosts = CreateDefaultGameData().Cities[i].Station.StationBuildingTypeCosts;
        if (GameData.Cities[i].Station.StationBuildingType == 0)
            GameData.Cities[i].Station.StationBuildingTypeCosts = CreateDefaultGameData().Cities[i].Station.StationBuildingTypeCosts;
        if (GameData.Cities[i].Station.CapacityMultiplier == 0)
            GameData.Cities[i].Station.CapacityMultiplier = 1;
        if (GameData.Cities[i].People.DensityMultiplier == 0)
            GameData.Cities[i].People.DensityMultiplier = 1;
        if (GameData.Cities[i].Bus.ProfitMultiplier == 0)
            GameData.Cities[i].Bus.ProfitMultiplier = 1;

        GameData.Cities[i].Station.Parameters = DefaultGameData.Cities[i].Station.Parameters;
        GameData.Cities[i].Bus.Parameters = DefaultGameData.Cities[i].Bus.Parameters;
        GameData.Cities[i].People.Parameters = DefaultGameData.Cities[i].People.Parameters;
    }
}

我希望以前版本的用户保留他们的数据,并拥有新变量的默认数据。您将如何处理向现有序列化数据添加新数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-30 22:27:38

使用保存格式值

通过了解保存文件的版本,您可以很容易地确定是否尝试解码给定值。

如果你没有,那就添加一个。否则你将不得不这样做:

代码语言:javascript
复制
public static void deserialize(ref SerializationInfo info, ref StreamingContext context) {
    SerializationInfoEnumerator infoEnum = info.GetEnumerator();
    Hashtable values = new Hashtable();
    while(infoEnum.MoveNext()) {
        SerializationEntry val = infoEnum.Current;
        values.Add(val.Name, val.Value);
    }
    ...
}

然后使用哈希表来确定给定值是否存在。

如果您使用的是保存版本,您可以先读出它,然后查询它,看看会发生什么:从二进制数据中读出值或将其设置为默认值。那就是way, way easier

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57272109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档