我使用的是使用BinaryReader和Writer的Unity3D序列化工具。 使用此工具保存玩家游戏状态。顺序读写的缺点是您必须以相同的顺序读取该文件。
当我想向类中添加新变量时,它会破坏读取顺序
public override void Write(object obj, ES2Writer writer)
{
SettingsBrigde data = (SettingsBrigde)obj;
writer.Write(data.FxVolume);
writer.Write(data.MusicVolume);
writer.Write(data.shadow);
writer.Write(data.isBaterySave);
writer.Write(data.controllerType);
writer.Write(data.qualityPreset);
//New variables after game release
writer.Write(data.mynewvariable);
}
public override void Read(ES2Reader reader, object c)
{
SettingsBrigde data = (SettingsBrigde)c;
data.FxVolume = reader.Read<System.Single>();
data.MusicVolume = reader.Read<System.Single>();
data.shadow = reader.Read<System.Boolean>();
data.isBaterySave = reader.Read<System.Boolean>();
data.controllerType = reader.Read<TouchInputLayout>();
data.qualityPreset = reader.Read<QualitySetttingsOptions>();
//New variables after game release
data.mynewvariable = reader.Read<System.Single>();
}
正如您所看到的,如果我在新的更新后读取该文件,它将读取错误的数据或根据流的下一个状态抛出异常。
有一个临时解决方案,我首先编写文件版本。并阅读该版本以确定我将在下一步中阅读的内容
public override void Write(object obj, ES2Writer writer)
{
fileVersion = 2;
SettingsBrigde data = (SettingsBrigde)obj;
writer.Write(fileVersion);
writer.Write(data.FxVolume);
writer.Write(data.MusicVolume);
writer.Write(data.shadow);
writer.Write(data.isBaterySave);
writer.Write(data.controllerType);
writer.Write(data.qualityPreset);
//New variables after game release
writer.Write(data.mynewvariable);
}
public override void Read(ES2Reader reader, object c)
{
SettingsBrigde data = (SettingsBrigde)c;
int currentVersion = reader.Read<System.Int32>();
data.FxVolume = reader.Read<System.Single>();
data.MusicVolume = reader.Read<System.Single>();
data.shadow = reader.Read<System.Boolean>();
data.isBaterySave = reader.Read<System.Boolean>();
data.controllerType = reader.Read<TouchInputLayout>();
data.qualityPreset = reader.Read<QualitySetttingsOptions>();
//New variables after game release
if (currentVersion == 2)
{
data.mynewvariable = reader.Read<System.Single>();
}
}
如果你有,我正在寻找更合适的解决方案。
感谢。
答案 0 :(得分:0)
我们自己为每条消息使用版本控制。我们的服务器端无法确定客户端是否已更新,因此我们始终可以从客户端获取旧版本,只要不是所有客户端都更新,我们仍然需要支持。
在您的情况下,您似乎确信您只需要支持一个版本。因此,您可以在更新游戏时更新所有播放器设置。阅读设置,添加一个额外的默认值并再次保存。这样您只需支持一个版本。