클래스 통째로 xml 저장 / 로드하기


이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다.


 

클래스 통째로 xml 저장 / 로드하기

지난번에 LitJson 라이브러리를 이용해서 Json 데이터를 다루는 방법에 대해서 소개해 드렸었는데요.

이번에는 XML 데이터를 다루는 방법에 대해서 해볼까 합니다.

바로 예제로 들어가보겠습니다.

아래 클래서가 예제에서 xml 데이터로 쓰고 / 읽어올 클래스 입니다.

“ToString()” 함수를 아래처럼 override해서 구현을 해주면, 이 클래스 객체를 Debug.Log로 바로 넘겼을 때 ToString 함수가 자동 호출되서 아래 보이는 문자열이 반영됩니다.

꼭 하셔야 되는 부분은 아니고, 그냥 디버깅용으로 유용해서 자주 이용하는 편이라 해두었습니다.


public class Employee
{
    [XmlAttribute("empCode")]
    public int empCode;
    [XmlAttribute("empName")]
    public string empName;

    public override string ToString ()
    {
        return "empCode: " + empCode + " empName: " + empName;
    }
}

이제 이 클래스를 xml로 먼저 저장을 해보겠습니다.

void XMLSerialize(Employee emp, string filePath)
{
    serializer = new XmlSerializer(typeof(Employee));
    TextWriter writer = new StreamWriter(filePath);
    serializer.Serialize(writer, emp);
    writer.Close();
}

위와 같은 함수를 하나 만들고 해당 함수에 저장할 Employee 객체와, 파일로 저장할 .xml파일의 경로를 지정해주면 xml로 저장이 됩니다.

흐름만 간단히 설명을 해드리면 Employee 타입으로 XmlSerializer라는 객체를 생성하고, 이를 파일로 쓰기 위해서 TextWriter 객체를 생성합니다.

그 뒤에 XmlSerializer의 Serialize 함수를 이용해서 TextWriter객체에 emp 데이터를 넘겨서 저장을 해주고, 완료가 되면 파일쓰기를 끝냅니다.

이해가 되지 않으셔도 괜찮습니다.

편히 읽고 넘어가시면 됩니다.

그리고 저장을 했으면 불러와야 겠죠?
불러오는 함수는 쓴 함수의 반대로 해주시면 됩니다.

Employee XMLDeserialize(string filePath)
{
    serializer = new XmlSerializer(typeof(Employee));
    stream = new FileStream(filePath, FileMode.Open);
    emp = (Employee)serializer.Deserialize(stream);
    stream.Close();

    return emp;
}

거꾸로 이번에는 파일에서 Stream 데이터를 읽어와서 XmlSerializer의 Deserialize 함수를 이용해서 Employee 객체에 해당 데이터의 내용을 전달하고 이를 리턴하도록 했습니다.
이제 전체 코드를 보겠습니다.


using UnityEngine;
using System;
using System.Collections;
using System.Xml.Serialization;
using System.IO;

public class Employee
{
    [XmlAttribute("empCode")]
    public int empCode;
    [XmlAttribute("empName")]
    public string empName;

    public override string ToString ()
    {
        return "empCode: " + empCode + " empName: " + empName;
    }
}

public class XmlTest : MonoBehaviour
{
    XmlSerializer serializer = null;
    FileStream stream = null;
    Employee emp = null;
    string fileName = string.Empty;

    void Start()
    {
        emp = new Employee{ empCode = 10, empName = "Ronnie" };
        fileName = Application.dataPath + "/test.xml";
    }

    void OnGUI()
    {
        if (GUILayout.Button("save"))
        {
            XMLSerialize(emp, fileName);
        }

        if (GUILayout.Button("Load"))
        {
            if (File.Exists(fileName))
            {
                emp = XMLDeserialize(fileName);
                Debug.Log(emp);
            }
        }
    }

    void XMLSerialize(Employee emp, string filePath)
    {
        serializer = new XmlSerializer(typeof(Employee));
        TextWriter writer = new StreamWriter(filePath);
        serializer.Serialize(writer, emp);
        writer.Close();
    }

    Employee XMLDeserialize(string filePath)
    {
        serializer = new XmlSerializer(typeof(Employee));
        stream = new FileStream(filePath, FileMode.Open);
        emp = (Employee)serializer.Deserialize(stream);
        stream.Close();

        return emp;
    }
}

위 코드를 보면 OnGUI에서 “Save” 버튼을 누르면 xml 파일로 저장을, “Load”버튼을 누르면 저장한 xml 파일을 읽어서 Debug.Log로 찍도록 했습니다.

테스트를 해보겠습니다.
위의 스크립트를 저장한뒤에 빈 게임 오브젝트를 하나 생성하고 이 스크립트를 붙여줍니다.

그리고 유니티를 Play 하면 아래와 같이 Save 버튼과 Load 버튼이 화면에 뜨는데 일단 Save 버튼부터 눌러보겠습니다.

실행화면

Save 버튼을 누르고 프로젝트 폴더를 보면 test.xml 이라는 xml 파일이 생성된 것을 확인할 수 있습니다.

xml 생성
아래처럼 xml 문서가 생성된것도 확인할 수 있습니다.

생성된 xml

이제 xml 파일을 읽어서 emp 객체로 전달한 뒤에 이를 Debug.Log로 찍어보겠습니다.
그냥 간단히 Load 버튼만 누르면 됩니다.

실행결과

json 처럼 xml 도 다루기가 그리 어렵지만은 않습니다.

여러분이 파일로 쓰려는 데이터 타입을 예제처럼 클래스로 따로 정리를 해두시고,

여기에 데이터를 저장한 뒤에 xml 파일로 저장을 하는 방식으로 데이터를 다루시면 편리하게 사용이 가능합니다.

 

 

내용 끝까지 읽어주셔서 감사합니다.

배너 클릭은 저에게 많은 힘이 됩니다.

감사합니다 🙂

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, 웹 개발, 1인 기업, 독서, 책쓰기에 관심이 많습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다