【问题标题】:C# Serialization Woes - Int Array not saving/returning correctlyC# 序列化问题 - Int 数组无法正确保存/返回
【发布时间】:2016-07-27 11:19:03
【问题描述】:

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

我有以下代码/类,用于使用 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# BinaryFormatter。只需 BinaryFormatter.Serialize() 函数。
  • 没有骰子,所有的 TileData.Corners 都反序列化为 255,无论出于何种原因。
  • 好吧,您用于序列化的一段代码将有助于解决问题。
  • Bolierplate BinaryFormatter.Serialize(FileStream,Class) 代码。真的很难把这部分搞砸,而且 SOMETHING 正在序列化和反序列化而没有错误的事实告诉我(显然大多数其他人)有一个数据/结构问题正在传递给序列化程序。我相信我找到了一种解决方法,只需在类中实现我自己的 BinaryWriter/BinaryReader 函数并在没有格式化程序帮助的情况下创建文件。从我的搜索结果来看,它也将大大提高性能。感谢您对此事的持续关注,不胜感激。

标签: c# serialization unity3d


【解决方案1】:

对此我不确定,但变量被标记为只读这一事实是否会妨碍正确的反序列化?

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

【讨论】:

  • 将类更改为 struct 并删除了 readonly 以及两者的所有组合,它仍然会发生。位置 int 数组正在正确保存,所以我想知道在数组中序列化 TileData 类是否有问题。不使用 JSON,因为据我了解,我所读到的是它会生成我目前不想要的人类可读的保存文件。
  • JSON 确实做到了这一点,但我相信 Unity 在构建应用程序时会加密这些文件。
  • @Pysassin 我第二次使用 Json。我认为 Unity 中的 BinaryFormatter 存在问题。有一种东西叫做加密。您可以加密 json 字符串然后保存它。谷歌“C#字符串加密”。
  • 谢谢,也可以考虑手动编写二进制文件而不是使用 BinaryFormatter,因为在 Unity 中加载需要很长时间。
【解决方案2】:

可序列化的类必须是一个简单的容器带有无参数构造函数(仅在 Xml 序列化中)。

看看this post

类似的东西

[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;
    }
}

【讨论】:

  • 对所有显示的类进行了上述操作,结果相同。感谢您始终愿意尝试的意见。
  • 虽然这可能有效,但请记住这是XmlSerializer 的限制。注意 BinaryFormatter 不是BinaryFormatter。 @Pysassin 只需像 Mihai 提到的那样使用 Json,直到这在 Unity 中得到修复。
  • 这些类中传递的信息或类本身都没有通过 Unity 结构继承任何东西,它们都是 .NET 结构。为什么你认为 Unity 会导致这个问题?
  • 感谢@Smartis 提供的其他链接,我可能不得不尝试实现 ISerializable 接口,看看是否能解决问题。
  • 这是一种惊人的浪费时间,而且永远不会奏效。如果(令人难以置信)您拥有的数据多于使用 PlayerPrefs 可以轻松保存的数据,请执行此操作 ...stackoverflow.com/a/35941579/294884
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 2016-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多