JsonUtility

Unity3D 2019. 3. 7. 01:31
반응형

https://docs.unity3d.com/kr/current/Manual/JSONSerialization.html

https://answers.unity.com/questions/1123326/jsonutility-array-not-supported.html



벤치마크 테스트에서는 JsonUtility가 인기 .NET JSON 솔루션에 비해(일부 솔루션보다 기능이 더 적기는 하지만) 훨씬 빠른 것으로 나타났습니다.


지원되는 타입

API는 MonoBehaviour 서브클래스, ScriptableObject 서브 클래스, 또는 [Serializable] 속성이 있는 일반 클래스/구조체를 지원합니다. 사용자가 전달하는 오브젝트는 스탠다드 Unity 시리얼라이저에 공급되어 처리되므로, 인스펙터에서 적용되는 규칙과 제한이 동일하게 적용됩니다. 즉 필드만 직렬화되고 Dictionary<> 같은 타입은 지원되지 않습니다.

예를 들어 프리미티브 타입 또는 배열 등 다른 타입을 API에 직접 전달하는 기능은 현재 지원되지 않습니다. 지금은 이러한 타입을 일종의 class 또는 struct에 래핑해야 합니다.

에디터에만 EditorJsonUtility라는 병렬 API가 있습니다. API는 UnityEngine.Object에서 파생된 타입을 JSON과 상호 직렬화하기 위해 사용할 수 있습니다. 그러면 오브젝트의 YAML 표현과 동일한 데이터가 포함된 JSON이 생성됩니다.


문자열 인용부호 넣기 

https://docs.microsoft.com/ko-kr/dotnet/framework/winforms/controls/how-to-put-quotation-marks-in-a-string-windows-forms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
[Serializable]
public class CharacterData
{
    public int id;
    public string name;
    public string res_name;
    public string sprite_name;
}
 
public class JsonUtilityHelper
{
    public static T[] FromJson<T>(string json)
    {
        string newJson = "{ \"array\": " + json + "}";
        Debug.Log(newJson);
        Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(newJson);
        return wrapper.array;
    }
 
    public static string ToJson<T>(T[] array)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.array = array;
        return JsonUtility.ToJson(wrapper);
    }
 
    [Serializable]
    private class Wrapper<T>
    {
        public T[] array;
    }
}
 
public class App : MonoBehaviour
{
    public TextAsset ta;
 
    // Start is called before the first frame update
    void Start()
    {
        var arrCharacterData = JsonUtilityHelper.FromJson<CharacterData>(ta.text);
        foreach (var data in arrCharacterData)
        {
            Debug.LogFormat("{0} {1}", data.id, data.name);
        }
 
        var json = JsonUtilityHelper.ToJson(arrCharacterData);
        Debug.Log(json);
 
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
}
 
cs





public class CharacterData
{
    public int id;
    public string name;
    public string res_name;
    public string sprite_name;
}


[Serializable] 하지 않는다면?


NullReferenceException: Object reference not set to an instance of an object

App.Start () (at Assets/App.cs:48)

Serialization은 개체를 저장하거나 메모리, 데이터베이스 또는 파일로 전송하기 위해 개체를 바이트 스트림으로 변환하는 프로세스입니다. 주 목적은 필요할 때 다시 만들 수 있도록 개체의 상태를 저장하는 것입니다. 역 프로세스를 deserialization이라고 합니다.

Serialization 작동 방법

이 그림에서는 serialization의 전체 프로세스를 보여 줍니다.

Serialization 그래픽

개체는 스트림으로 serialize되어 데이터 뿐만 아니라 버전, 문화권 및 어셈블리 이름과 같은 개체 형식에 대한 정보를 운반합니다. 해당 스트림에서 데이터베이스, 파일 또는 메모리에 저장될 수 있습니다. (이하 생략)



https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/serialization/





반응형
: