C#序列化问题-Int数组未正确保存/返回

本文关键字:确保 保存 返回 序列化 问题 -Int 数组 | 更新日期: 2023-09-27 17:58:46

我希望有人能告诉我我做错了什么,以及纠正错误的最佳方法(或者给我指一个这样做的链接)。

我有下面的代码/类,我正在使用BinaryFormatter序列化我的数据。由于某种原因,TileData类中的第一个int(Corners)一直反序列化为255。在序列化之前,我已经验证了数据是否正确地保存在结构中,因此在序列化和反序列化之间,数据发生了一些事情,我不确定为什么或如何检查它是哪一端。

有什么想法吗?

[Serializable]
public class GameSaveData
{
    public readonly string Name;
    public readonly int[] LevelSettings;
    public readonly int[] GTime;
    public readonly ChunkData[] Data; 
    public GameSaveData(string _name, int[] _settings, int[] _time, ChunkData[] _chunks)
    {
        Name = _name;
        LevelSettings = _settings;
        GTime = _time;
        Data = _chunks;
    }
}
[Serializable]
public class TileData
{
    public readonly int Corners;
    public readonly int TypeID;
    public readonly int[] FloorSpecs; // 0 -- Floor Missing, 1 - Floor Type ID, 2 -- SubFloor Type
    public TileData(int _c, int _t, int[] _floorSpecs)
    {
        Corners = _c;
        TypeID = _t;
        FloorSpecs = _floorSpecs;
    }
}
[Serializable]
public class ChunkData
{
    public readonly int[] Position;
    public readonly TileData[] Data;
    public ChunkData(Vector3 _pos, TileData[] _data)
    {
        Position = new int[] { (int)_pos.x, (int)_pos.y, (int)_pos.z };
        Data = _data;
    }
}

C#序列化问题-Int数组未正确保存/返回

我对此不确定,但变量标记为只读这一事实难道不会阻止正确的反序列化吗?

为什么不使用Unity中提供的JsonUtility类呢?毕竟,Json的应用范围更广。

可序列化类必须是具有无参数构造函数的简单容器

(仅在Xml序列化时)。

看看这篇文章。

像这样的

[Serializable]
public class GameSaveData
{
    public string Name { get; set; }
    public int[] LevelSettings { get; set; }
    public int[] GTime { get; set; }
    public ChunkData[] Data { get; set; }
    private GameSaveData() 
    {
        // parameter less constrctor
    }
    public GameSaveData(string _name, int[] _settings, int[] _time, ChunkData[] _chunks)
    {
        Name = _name;
        LevelSettings = _settings;
        GTime = _time;
        Data = _chunks;
    }
}
[Serializable]
public class TileData
{
    public int Corners { get; set; }
    public int TypeID { get; set; }
    public int[] FloorSpecs { get; set; } // 0 -- Floor Missing, 1 - Floor Type ID, 2 -- SubFloor Type
    public TileData()
    {
        // parameter less constrctor            
    }
    public TileData(int _c, int _t, int[] _floorSpecs)
    {
        Corners = _c;
        TypeID = _t;
        FloorSpecs = _floorSpecs;
    }
}
[Serializable]
public class ChunkData
{
    public readonly int[] Position { get; set; }
    public readonly TileData[] Data { get; set; }
    public ChunkData()
    {
        // parameter less constrctor                        
    }
    public ChunkData(Vector3 _pos, TileData[] _data)
    {
        Position = new int[] { (int)_pos.x, (int)_pos.y, (int)_pos.z };
        Data = _data;
    }
}