【发布时间】:2020-06-15 17:45:51
【问题描述】:
我正在使用 Unity3d 并使用 2019.3.3 编辑器构建游戏。
我在 IOS 版本中遇到问题。
我正在 Android 设备上尝试我的游戏,它运行良好,但是昨天我在 IOS 设备上尝试了我的游戏,但在 IOS 上保存和加载 xml 文件时遇到了问题。
我正在使用此代码进行保存:
SaveAvatar() {
XmlSerializer serializer = new XmlSerializer(typeof(AvatarData));
FileStream stream = new FileStream(Application.persistentDataPath + "avatar_data.xml", FileMode.Create);
serializer.Serialize(stream, avatarData);
stream.Close();
}
我正在使用此代码进行加载:
LoadAvatar() {
XmlSerializer serializer = new XmlSerializer(typeof(AvatarData));
FileStream stream = new FileStream(Application.persistentDataPath + "avatar_data.xml", FileMode.Open);
avatarData = (AvatarData)serializer.Deserialize(stream);
stream.Close();
}
Also in OnEnable function I create my xml file if it does not exists: Without this code, it is not saving the game in editor or android as well.
OnEnable () {
if (!File.Exists(Application.persistentDataPath + "avatar_data.xml")) { avatarData.jobID = 10000;
SaveAvatar();
}
即使序列化一个只包含一个 int 的类,这些代码在 IOS 中也不起作用。 (我尝试保存另一个类,看看我的主要保存类是否有问题)
我的保存类包含以下变量类型:
字符串、整数、枚举、浮点数、列表、其他类和自类变量
这是我班级的示例变量:(所有类型变量的示例)
[System.Serializable]
public class AvatarData{
public bool dead;
public string avatarName;
public int age;
public float health;
public AvatarData father; (Self Class variable)
public EnumGender gender; (Enum)
public JobClass job; (Another Class variable)
public List<GroupClass> groups; (Another Class List variable)
public List<AvatarData> children; (Self Class List variable)
public List<PetClass> pets;
public List<LogClass> logs;
public List<JobClass> Jobs;
public List<EventClass> tempEvents;
public List<ItemsClass> myItems;
}
当我使用 SaveAvatar 或 LoadAvatar 函数时,在 IOS 中,它会出现错误,并且代码不会继续更进一步的行。没有保存它工作正常。
谁能告诉我我的代码有什么问题
谢谢
【问题讨论】:
-
永远不要对系统路径使用简单的字符串连接!而是使用
Path.Combine,它根据操作系统使用正确的路径分隔符。请注意,尤其是没有分隔符的Application.persistentDataPath + "avatar_data.xml"毫无意义,因为这将是Application.persistentDataPath文件夹外部 的文件!而是将其替换为Path.Combine(Application.persistentDataPath, "avatar_data.xml")。它在 Android 上运行的原因可能是不那么严格的文件访问规则.. -
当我遇到这样的反序列化 xml 问题时,我会做以下两件事之一: 1) 在 c# 中注释掉属性和类,直到我运行代码以确定哪些属性导致问题。 2)用样本数据创建一个类,然后序列化。然后将序列化 xml 与您正在阅读的进行比较以查看差异。
-
@jdweng 我已经打开并清空项目并创建了一个带有一个 int 变量的新类。
-
@derHugo 我已经打开并清空了项目并创建了一个带有一个 int 变量的新类。我还添加了 path.combine 但仍然没有保存在 iOS 中。感谢您的回复
-
@derHugo if (!File.Exists(Path.Combine(Application.persistentDataPath + "player_data.xml"))) { SavePlayerData(); } public void SavePlayerData() { XmlSerializer 序列化器 = new XmlSerializer(typeof(PlayerData)); FileStream 流 = new FileStream(Path.Combine(Application.persistentDataPath + "player_data.xml"), FileMode.Create);序列化器。序列化(流,播放器数据);流。关闭(); } [System.Serializable] public class PlayerData { public int number; }