为什么我的整数属性没有被BinaryFormatter序列化?

时间:2014-09-19 18:14:02

标签: c# serialization unity3d

在Unity上制作游戏,虽然我不确定这个问题是否重要:

创建一个MyClass对象并将其整数width属性设置为100.

    MyClass obj         = new MyClass();
    obj.width = 100;
    BinaryFormatter bf  = new BinaryFormatter();
    FileStream file     = File.Create ("stuff.dat");
    bf.Serialize(file, obj);
    file.Close();

加载它。

    BinaryFormatter bf = new BinaryFormatter();
    FileStream file = File.Open("stuff.dat");
    MyClass obj = (MyClass)bf.Deserialize(file);
    file.Close();

width属性默认为0,而不是100。


using UnityEngine;
using System.Collections;

[System.Serializable]
public class MyClass {

    public  int             width           = 0;
    public  int             height          = 0;

}

为什么?

1 个答案:

答案 0 :(得分:0)

我知道这个问题就像2个月大,但我想给其他任何可能偶然发现这个问题的人给出一个正确的答案,如果可以的话?

重要的是要注意,当您创建类的“新”版本时,它是一个“新”版本。所以在另一个类中说,你做一个MyClass mycla = new MyClass();并设置宽度mycla.width = 100;然后你进入另一个类并做一个MyClass mycla = new MyClass();并尝试使用mycla.width,宽度将返回到主变量列表中指定的默认值。

这就是为什么你应该使用一个对象来表示你想要序列化的类中的数据。该类的对象引用包含有关其变量的已保存信息,这些变量已从其默认值更改。

这就是我在当前游戏中处理保存的方式,并且它对游戏玩家表现良好:

    using UnityEngine;
        using System.Collections;
        using System;
        [Serializable]
        public class MyClass 
        {
            public static MyClass saveObj;
            public  int width = 0;
            public  int height = 0;
}
    //(please use another script to perform these saving and loading operations):


    public void Save()
    {
        MyClass obj = new MyClass();
        obj.width = 100;
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create ("stuff.dat");
        bf.Serialize(file, obj);
        file.Close();
    }

    public void Load()
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open("stuff.dat");
        MyClass.saveObj = (MyClass)bf.Deserialize(file);
        file.Close();
        print(MyClass.saveObj.width);
    }