C# 无法读取Unity 5中的序列化代码

C# 无法读取Unity 5中的序列化代码,c#,unity3d,C#,Unity3d,所以,我要做的是将一个浮点和一个字符串保存到一个数据库中,以便稍后在一个持久的highscore表中使用这些值 我已经做到了可以保存数据的程度,我向save函数输入的条目越多,文件就越大。所以我想,这是可行的 当我想反序列化文件以读取和构造scoretable时,会出现以下错误: InvalidCastException:无法从源类型强制转换为目标类型。 loadHighScore.LoadFromFile()(位于Assets/scripts/GameManager/loadHighScore

所以,我要做的是将一个浮点和一个字符串保存到一个数据库中,以便稍后在一个持久的highscore表中使用这些值

我已经做到了可以保存数据的程度,我向save函数输入的条目越多,文件就越大。所以我想,这是可行的

当我想反序列化文件以读取和构造scoretable时,会出现以下错误:

InvalidCastException:无法从源类型强制转换为目标类型。 loadHighScore.LoadFromFile()(位于Assets/scripts/GameManager/loadHighScore.cs:40)loadHighScore.Start()(位于Assets/scripts/GameManager/loadHighScore.cs:18)

以下是两个脚本:

高分计数器:

using UnityEngine;
using System.Collections;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

public class highscoreCounter : MonoBehaviour
{

    public static highscoreCounter control;

    public int highScoreFinal;
    public string playerName;

    void Update()
    {
        highScoreFinal = GetComponent<highscoreCalculator>().highScoreFinal;
        playerName = GameObject.Find("LevelFinisher").GetComponent<finishLevel>().newPlayerName;
        SaveToFile();
    }
    public void SaveToFile()
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(Application.persistentDataPath + "/highScore.dat");

        PlayerData data = new PlayerData();
        data.playerName = playerName;
        data.highScoreFinal = highScoreFinal;

        bf.Serialize(file, data);
        file.Close();
    }

    [Serializable]
    class PlayerData
    {
        public int highScoreFinal;
        public string playerName;
    }
}
using UnityEngine;
using System.Collections;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

public class loadHighScore : MonoBehaviour {

    public static loadHighScore control;
    int highScoreFinal;
    string playerName;

    public GameObject playerEntry;


    void Start () {

        LoadFromFile();
    }


    public void LoadFromFile()
    {
        if (File.Exists(Application.persistentDataPath + "/highScore.dat"))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/highScore.dat", FileMode.Open);
            PlayerData data = (PlayerData)bf.Deserialize(file);

            file.Close();

            playerName = data.playerName;
            highScoreFinal = data.highScoreFinal;
            print(playerName);
            print(highScoreFinal);
        }


    }

    [Serializable]
    class PlayerData
    {
        public int highScoreFinal;
        public string playerName;
    }
}
对于这段代码,如果有人想知道的话,我遵循了UnitySYT频道上的序列化教程


如果有人能把我引导到正确的方向上,我会非常有帮助,因为我已经看了大约3个小时了,但还没有弄清楚是什么问题。

尝试将PlayerData类移动到一个单独的文件中,否则这两个PlayerData类被视为独立的,因此不兼容

编辑: 要澄清,请从unity创建新脚本,并用以下内容替换内容:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System;

[Serializable]
class PlayerData
{
    public int highScoreFinal;
    public string playerName;
}

然后删除这两个PlayerData类,因为您现在不需要它们

尝试将PlayerData类移动到单独的文件中,否则这两个PlayerData类将被视为独立的,因此不兼容

编辑: 要澄清,请从unity创建新脚本,并用以下内容替换内容:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System;

[Serializable]
class PlayerData
{
    public int highScoreFinal;
    public string playerName;
}

然后删除您拥有的两个PlayerData类,因为您现在不需要它们

BinaryFormatter
因底层数据结构发生更改时数据不可分离而臭名昭著。尝试切换到更宽容的seralization结构,如XML或JSON。你好,Scott,感谢您提供的更改为XML的提示。尽管如此,我还是想知道这里发生了什么,因为我不明白为什么会发生。Cheers我不想用更好地存储在外部文件中的数据污染我的PlayerPref。BinaryFormatter因底层数据结构发生变化时数据不可提取而臭名昭著。尝试切换到更宽容的seralization结构,如XML或JSON。你好,Scott,感谢您提供的更改为XML的提示。尽管如此,我还是想知道这里发生了什么,因为我不明白为什么会发生。Cheers可能重复的我不想用更好地存储在外部文件中的数据污染我的PlayerPrefs。谢谢,当我将其存储在另一个文件中时,我该如何称呼它?最好将此文件称为PlayerData.cs,我编辑了我的答案以更好地解释它谢谢帮助!它修复了错误,但显然保存的*.dat文件中仍然没有任何内容,因为返回的字符串值为Null,整数值为0。谢谢,当我将它存储在另一个文件中时,我该如何调用它?最好将此文件称为PlayerData.cs,我编辑了我的答案以更好地解释它谢谢帮助!它修复了错误,但显然保存的*.dat文件中仍然没有任何内容,因为字符串的返回值为Null,整数的返回值为0。