설정값 저장을 위한 ini 파일 과 yaml 파일 사용방법 - C#

Software/C#|2023. 11. 29. 14:47
반응형

장비제어 프로그램 개발시에 시스템의 하드웨어 설정값등을 저장하고 불러 오는 용도로 ini 파일 저장과 yaml 파일 저장 방법을 사용할 수 있도록 테스트 프로그램을 작성해 보았습니다. 

 

Ini_Yaml.zip
0.01MB

 

ini 파일 저장은 인터넷에 있는 Class 를 다운받아 사용하였습니다. yaml 은 YamlDotNet 라이브러리를 사용하였습니다. 

 

코드 작성이나 향후 항목 변경이 되었을 경우 코드 변경에서는 yaml이 편하고 좋습니다. 하지만 프로그램 사용자가 yaml 데이타를 직접 수정할 경우에는 규칙을 지켜서 수정해야 하는 번거로움은 좀 있네요.. 

 

파일에 저장되는 형태는 아래와 같습니다. 

ini 저장 데이타 파일

[Temperature]
Offset-1=12.3
Offset-2=53.987
[System]
Name=test
Item-1=0

 

yaml 저장 데이타 파일

temperature:
  Offset1: 3
  Offset2: 4
system:
  Name: bbb
  Item1: 3
  Item2: 0
  ListItems:
  - 11
  - 22
  - 33

 

아래 코드는 yaml 사용에 대한 내용입니다.

    public class MachineData
    {
        public class Temperature
        {
            public double Offset1 { get; set; }
            public double Offset2 { get; set; }
        }

        public class System
        {
            public string Name { get; set; }
            public int Item1 { get; set; }
            public int Item2 { get; set; }
            public List<double> ListItems { get; set; }

            public System() 
            { 
                ListItems = new List<double>(); 
            }
        }

        public Temperature temperature = new Temperature();
        public System system = new System();
    }

    public class YamlControl<T>
    { 
        public void SaveYaml(string FileName, T data)
        {
            var serializer = SerializeToYaml(data);

            using StreamWriter sw = new StreamWriter(FileName);
            sw.Write(serializer);
        }

        public T LoadYaml(string FileName)
        {
            T machine = DeserializeFromYaml<T>(FileName);

            return machine;
        }

        private string SerializeToYaml<T>(T obj)
        {
            var serializer = new SerializerBuilder().Build();
            return serializer.Serialize(obj);
        }

        // Deserialize YAML to an object
        private T DeserializeFromYaml<T>(string yaml)
        {
            var deserializer = new DeserializerBuilder().Build();
            return deserializer.Deserialize<T>(File.ReadAllText(yaml));
        }
    }
반응형

댓글()