将对象强制转换为C#

时间:2017-02-12 09:41:51

标签: c# unity3d casting binary filestream

尝试将.dat文件强制转换为自己的类

  level0 = (Level0) LoadObjInBinary(level0, "Level" + levelNumber);

   public static object LoadObjInBinary(object myClass, string fileName) {
        fileName += ".dat";   
        if (File.Exists(FileLocation + fileName)) {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(FileLocation + fileName, FileMode.Open);
            myClass = bf.Deserialize(file);
            file.Close();
            return myClass;
        } else {
            return null;
        }
   }


Level() class

   [Serializable]
    public class Level0 { //Using this class to create Level.dat binary file 

        static int level = 1;
        static int moves = 15;
        static int seconds;
        static int minScoreForOneStar = 1000;
        static int minScoreForTwoStars = 1500;
        static int minScoreForThreeStars = 2000;

        static TargetObj[] targetObjs = {new TargetObj(Targets.Black, 10), new TargetObj(Targets.Freezer, 1), new TargetObj(Targets.Anchor, 2)}; 

        static Color[] colors = {Constants.grey, Constants.green, Constants.pink, Constants.brown, Constants.purple, Constants.lightBlue};

        static Cell[,] levelDesign;  

      //the rest is Properties of Fields

    }

问题:LoadObjInBinary返回null。文件路径是正确的,类也匹配,但不知道为什么“(Level0)对象”不工作......

由于

1 个答案:

答案 0 :(得分:2)

感谢您提供Level0类。

问题是静态字段从不被序列化,因为它们不属于您实例化的对象的实例,它们是全局的。

我假设您需要它们是静态的,因此可以从应用程序的所有部分访问它们,快速解决方法是使用非静态成员创建另一个类,然后对其进行序列化 - 反序列化,并指定它值为Level0的全局静态实例(无论您在何处使用它)。

[Serializable]
class Level0Data
{
    int level = 1;
    int moves = 15;
    int seconds;
    int minScoreForOneStar = 1000;
    ...
}

然后在序列化和反序列化后,您可以执行以下操作。

 Level0Data deserializedObject = (Level0Data) LoadObjInBinary(..);
 Level0.level = deserializedObject.level;
 Level0.moves = deserializedObject.moves;

因为你必须确保Level0.level,move和所有其他成员都是公开的,或者至少可以公开以其他方式进行修改。

另外你必须确保

class TargetObj{}
class Cell{}

也标记为Serializable,否则它们不会写在文件上,也不会写入任何反序列化信息。

修改

您可以在此处找到Unity支持的所有可序列化类型:

Unity SerializeField