美文网首页
Unity JSON序列化

Unity JSON序列化

作者: 86a262e62b0b | 来源:发表于2019-11-06 12:52 被阅读0次

    文档

    一. 基本使用

    [Serializable]
    public class MyClass
    {
        public int level;
        public float timeElapsed;
        public string playerName;
    }
    
    MyClass myObject = new MyClass();
    myObject.level = 1;
    myObject.timeElapsed = 47.5f;
    myObject.playerName = "Dr Charles Francis";
    
    string json = JsonUtility.ToJson(myObject);
    

    =>

    {"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}
    

    要将 JSON 转换回对象,请使用 JsonUtility.FromJson:

    myObject = JsonUtility.FromJson<MyClass>(json);
    
    • 这将创建一个新的 MyClass 实例,并使用 JSON 数据设置该实例的值。如果 JSON 数据包含的值未映射到 MyClass 中的字段,则将忽略这些值,而如果 JSON 数据缺少 MyClass 字段的值,则这些字段将保留返回对象中的构造值
    • JSON 序列化程序当前不支持使用“非结构化”JSON(即,以键/值对的任意树形式导航和编辑 JSON)。如果需要这样做,应采用功能更全面的 JSON 库

    二. 用 JSON 覆盖对象

    也可以获取 JSON 数据并在已经创建的对象“之上”反序列化该数据,从而覆盖已存在的数据:

    JsonUtility.FromJsonOverwrite(json, myObject);
    
    • 在 JSON 中不包含值的对象上的任何字段都将保持不变。此方法允许通过重用先前创建的对象将分配保持在最低限度,并允许故意用仅包含一小部分字段的 JSON 来覆盖对象以便“修补”对象
    • 注意,JSON 序列化程序 API 支持 MonoBehaviour 和 ScriptableObject 子类以及普通结构/类。但是,将 JSON 反序列化为 MonoBehaviour 或 ScriptableObject 的子类时,必须使用 FromJsonOverwrite;FromJson 不受支持并将抛出异常。

    三.支持的类型

    四. 性能

    1. 基准测试表明,JsonUtility 要比流行的 .NET JSON 解决方案快得多(尽管功能比其中一些解决方案更少)

    2. GC 内存使用量为最低量:

    • ToJson() 仅为返回的字符串分配 GC 内存。
    • FromJson() 仅为返回的对象以及所需的所有子对象分配 GC 内存(例如,如果对包含数组的对象进行反序列化,则将为该数组分配 GC 内存)。
    • FromJsonOverwrite() 仅根据需要为写入的字段(例如字符串和数组)分配 GC 内存。如果 JSON 覆盖的所有字段都是值类型,则不应分配任何 GC 内存。
    1. 允许使用后台线程中的 JsonUtility API。与任何多线程代码一样,在一个线程上序列化/反序列化对象时,应注意不要在另一个线程上访问或更改该对象。

    五. 控制 ToJson() 的输出

    • ToJson 支持完美打印 JSON 输出。此功能默认为关闭状态,但可通过传递 true 作为第二个参数来打开此功能。
    • 可使用 [NonSerialized] 属性从输出中省略字段。

    六. 未提前知道类型的情况下使用 FromJson()

    将 JSON 反序列化为包含“公共”字段的类或结构,然后使用这些字段的值来计算出您想要的实际类型。然后第二次反序列化为该类型。

    相关文章

      网友评论

          本文标题:Unity JSON序列化

          本文链接:https://www.haomeiwen.com/subject/yjkubctx.html