'JSON'에 해당되는 글 1건

  1. 2015/08/11 글뻥 유니티 3D Entity Class 생성과 관리하기 - 2
오늘은 지난시간에 이어 Json.net으로 Serialize와 Deserialize에 대해 알아보자.

Serialize는 흔히 직렬화라 이야기하기도 한다. 네트워크상에서 Class를 전송하는 등의 입출력을 위한 데이터의 배열 형태로 변환하는 과정을 직렬화라 하며,
반대의 경우 데이터의 배열 형태를 Class로 변환화는 과정을 Deserialize(역직렬화)라 한다.

이때의 데이터 형태는 Byte 또는 string 등의 형식으로 변환 될 수 있다.

암튼 각설하여 지난 시간에 이어서 JSON.NET 모듈을 구해서 Import 하던가 기타 등등의 Json Parser를 구하자.
(코딩 노가다 안하려면 Serialize / Deserialize 지원이 잘되는 모듈로 구하자. 안그럼 개고생은 예약해 놓은 거다)

Import가 완료 되었다면 지난시간에 사용한 Entity Class를 다음과 같이 고쳐주자. (본 예제는 JSON.NET을 사용한다. Windows어플에서 가장 많이 쓰이는 모듈이라서...)
using System.Collections.Generic;
using System.Collections;
using Newtonsoft.Json;

public class TestEntityRoot
{
//JsonProperty로 설정하였다.
 [JsonProperty("SubEntity")]
//Static이므로 Get; Set; 선언으로 입출력이 가능하도록 하였다.
 public static List<SubEntity> SubEntity { get; set; }
}

public class SubEntity
{
 public string x { get; set; }
 public string y { get; set; }
 public List<Sub2Entity> sub { get; set; }
}

public class Sub2Entity
{
 public int z;
}


이제 Json Code가 포함된 Scene 0 에 사용할 코드를 작성하자.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Scene0Behavior : MonoBehaviour {
 // Use this for initialization
 void Start () {
//JSON 데이터를 정의한다. x는 a, y는 b로 선언했다.
 string _json = @"{
           ""SubEntity"": [
            {
                       ""x"": ""a"",
                       ""y"": ""b"",
                       ""sub"" : [
                       {""z"" : 0 },
                       {""z"" : 1 }
                       ]
                      }
            ]
            }";
 //할당할때는 아무런 클래스를 선언하고 할당한다.
 var _e = JsonConvert.DeserializeObject<TestEntityRoot>(_json);
 
//접근할때는 엔티티 클래스를 직접 호출한다.
 Debug.Log("Scene 0 입력값시작##############");
 foreach (SubEntity _s in TestEntityRoot.SubEntity)
 {
            Debug.Log(_s.x);
 }
 Debug.Log("Scene 0 입력값끝##############");
//저장된 Json 데이터를 출력하고 다음 레벨을 로딩한다.
 Application.LoadLevel(1);
 }

}


Scene1에 사용될 소스를 다음과 같이 입력한다. Scene0과 다른점은 Json데이터 외에 변하는 것은 없다.
(단지 씬이 변경되더라도 데이터가 살아 있고 새로운 데이터를 넣었을때 어떻게 되는지 보여준는데 그 역할이 있다.)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Scene1Behavior : MonoBehaviour {

 // Use this for initialization
 void Start () {

 string _json = @"{
            ""SubEntity"": [
            {
                       ""x"": ""c"",
                       ""y"": ""d"",
                       ""sub"" : [
                       {""z"" : 2 },
                       {""z"" : 3 }
                       ]
                       }
            ]
            }";
 //할당할때는 아무런 클래스를 선언하고 할당한다.
 var _e = JsonConvert.DeserializeObject<TestEntityRoot>(_json);
 //접근할때는 엔티티 클래스를 직접 호출한다.
 Debug.Log("Scene 1 입력값시작##############");
 foreach (SubEntity _s in TestEntityRoot.SubEntity)
 {
 Debug.Log(_s.x);
 }
 Debug.Log("Scene 1 입력값끝##############");

 Application.LoadLevel(2);

 }

}


마지막으로 Scene2에서 사용될 소스는 데이터를 클리어 하고 입력된 값을 출력하는 코드이다.
using UnityEngine;
using System.Collections;

public class Scene2Behavior : MonoBehaviour {

 // Use this for initialization
 void Start () {
//시작과 동시에 데이터를 날려버린다.
 TestEntityRoot.SubEntity.Clear();
 Debug.Log("Scene 2 입력값시작##############");
 foreach (SubEntity _s in TestEntityRoot.SubEntity)
 {
 Debug.Log(_s.x);
 }
 Debug.Log("Scene 2 입력값끝##############");

 }

}


결과는 다음과 같다.
사용자 삽입 이미지
정상적으로 씬이 변경되더라도 데이터가 살아 있고, 새로운 Serialize 된 데이터가 들어오면 추가된다.

2015/08/11 01:47 2015/08/11 01:47