软件版本更改BinaryReader的顺序
问题描述:
我正在使用使用BinaryReader和Writer的Unity3D序列化工具。 用这个工具保存玩家的游戏状态。连续读取和写入的缺点是您必须以相同的顺序读取该文件。软件版本更改BinaryReader的顺序
时,我想新的变量添加到一个类,它打破了读取顺序
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>();
}
正如你可以看到,如果我读了之后新的更新程序文件时,它会读取错误的数据或抛出异常acording到流的下一个状态。
有一个临时解决方案,我首先写文件版本。和阅读该版本确定什么将我在下一步阅读
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>();
}
}
我找更体面的解决方案,如果你有。
谢谢。
答
我们对每条消息都使用版本控制。我们的服务器端并不确定客户端是否更新,所以我们总是可以从客户端获取旧版本,但只要并非所有客户端都已更新,我们仍然必须支持这些旧版本。
就你而言,你似乎确信你只需要支持一个版本。因此,您可以在更新游戏时更新所有玩家设置。阅读设置,添加一个额外的默认值并再次保存。这样你只需要支持一个版本。
游戏初始化时。如果存在,请查找保存文件。成功后,它正在加载。在我的情况下,如果播放器不触发写入方法,它将按照用户拥有的最新版本顺序读取。所以即使经过5次修改,当用户回来时它正在正确读取 – Lordinarius