티스토리 뷰

환경설정을 파일로 저장하는 예제는 수 없이 많지만

환경설정 구조가 변경되는 것에 대한 내용은 찾기 힘들다.

 

클래스 구조를 XML이나 바이너리로 저장하고

클래스 구조를 변형(속성을 추가하는 등)하면 파일을 읽을 때 매치가 안 되서 클래스를 초기화 해야한다.

 

JSON으로 저장하면 구조가 변경되더라도 같은 속성이면 값이 유지 된다.

 

소스코드 예)

1. 임의의 값을 Config1 클래스에 저장 후 시리얼라이징된 JSON 파일로 저장 한다.

※ 프로그램이 수정되어 Config1이 Config2로 변형되었다고 하자.

2. 저장된 JSON 파일을 Config2 인스턴스로 읽어들인다.

 

이전에 저장했던 임의의 값이 Config2에 들어있다.

문자열 또는 컬렉션 모두 정상 동작한다.

 

사용하기

NuGet에서 Newtonsoft.Json를 설치한다.

 

※ System.Text.Json은 Public으로 선언된 데이터만 가능하다.

예제 소스코드

환경설정 클래스
using System;
using System.Collections.Generic;
using System.Configuration;

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;


namespace ConfigFile
{
    [Serializable]
    public class Config1
    {
        public string Title { get; set; }
        public string Title2 { get; set; }
        public List<AGroup> Group { get; set; }

        public Config1()
        {
            Group = new List<AGroup>();
        }

        [Serializable]
        public class AGroup
        {
            public string Title { get; set; }

            public AGroup()
            {
            }
        }
    }

    [Serializable]
    internal class Config2
    {
        [Newtonsoft.Json.JsonProperty] internal string Title { get; set; }
        [Newtonsoft.Json.JsonProperty] internal List<AGroup> Group { get; set; }

        internal Config2()
        {
            Group = new List<AGroup>();
        }

        [Serializable]
        internal class AGroup
        {
            [Newtonsoft.Json.JsonProperty] internal string Title { get; set; }
            [Newtonsoft.Json.JsonProperty] internal string Title2 { get; set; }

            internal AGroup()
            {
            }
        }
    }
}

Public이 아니면 [JsonProperty]을 붙여야 한다.

그렇지 않으면 {} 처럼 비어있는 형태로 저장된다.

 

JSON 저장, 읽기 클래스
using System.IO;

namespace ConfigFile
{
    public class FileManager
    {
        public static T ReadJSONFile<T>(T obj, string fileName)
        {
            try
            {
                var fi = new FileInfo(fileName);
                if (fi.Exists)
                {
                    using (StreamReader file = File.OpenText(fileName))
                    {
                        var serializer = new Newtonsoft.Json.JsonSerializer();
                        obj = (T)serializer.Deserialize(file, typeof(T));
                    }
                }
            }
            catch
            {
                throw;
            }
            return obj;
        }

        public static bool WriteJSONFile(object obj, string fileName)
        {
            using (StreamWriter file = File.CreateText(fileName))
            {
                var serializer = new Newtonsoft.Json.JsonSerializer();
                serializer.Serialize(file, obj);

                return true;
            }
        }
    }
}

 

메인 폼 클래스
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ConfigFile
{
    public partial class Form1 : Form
    {
        Config1 config1 = new Config1();
        Config2 config2 = new Config2();

        public Form1()
        {
            InitializeComponent();

            button_Read1_Click(null, null);
            button_Read2_Click(null, null);
        }

        private void button_Save1_Click(object sender, EventArgs e)
        {
            if (config1 == null) config1 = new Config1();

            config1.Title = textBox1.Text;
            config1.Title2 = textBox1.Text;

            config1.Group = new List<Config1.AGroup>();
            config1.Group.Add(new Config1.AGroup { Title = "1kkkk" });

            if (FileManager.WriteJSONFile(config1, "config.txt"))
            {
                label_Result1.Text = "저장했습니다.";
            }
            else
            {
                label_Result1.Text = "저장 중 오류가 발생했습니다.";
            }
        }

        private void button_Save2_Click(object sender, EventArgs e)
        {
            if (config2 == null) config2 = new Config2();

            config2.Title = textBox2.Text;

            config2.Group = new List<Config2.AGroup>();
            config2.Group.Add(new Config2.AGroup { Title = "2xxxxx" });
            config2.Group.Add(new Config2.AGroup { Title2 = "2xxxxx" });

            if (FileManager.WriteJSONFile(config2, "config.txt"))
            {
                label_Result2.Text = "저장했습니다.";
            }
            else
            {
                label_Result2.Text = "저장 중 오류가 발생했습니다.";
            }
        }

        private void button_Read1_Click(object sender, EventArgs e)
        {
            try
            {
                var temp = FileManager.ReadJSONFile(config1, "config.txt");

                if (temp == null) return;
                config1 = temp as Config1;

                label_Result1.Text = "읽었습니다.";

                ConfigUpdate();
            }
            catch
            {
                label_Result1.Text = "읽는 도중 오류가 발생했습니다.";
            }
        }

        private void button_Read2_Click(object sender, EventArgs e)
        {
            try
            {
                var temp = FileManager.ReadJSONFile(config2, "config.txt");

                if (temp == null) return;
                config2 = (Config2)temp;

                label_Result2.Text = "읽었습니다.";

                ConfigUpdate();
            }
            catch
            {
                label_Result2.Text = "읽는 도중 오류가 발생했습니다.";
            }
        }

        private void ConfigUpdate()
        {
            textBox1.Text = config1?.Title;
            textBox2.Text = config2?.Title;

            textBox1a.Text = config1?.Group?[0].Title;
            textBox2a.Text = config2?.Group?[0].Title;

        }
    }
}

 

댓글
댓글쓰기 폼