YamlDotNet Part.1

최용국·2020년 3월 20일
0

오픈소스

목록 보기
1/2

YamlDotNet Part.1

Yaml은 Json이나 Xml 파일과 같이 사람이 읽을 수 있는 데이터 형태의 포맷이다. Yaml의 설계 목적은 사람이 읽을 수 있는 형태, 가독성에 특화되어 있다. 때문에 설정파일(config)의 목적으로 많이 쓰인다.

스펙 및 다른 정보를 취득하고 싶다면 아래 링크를 따라가보시길 바랍니다.

YAML Ain't Markup Language (YAML™) Version 1.2

YAML Ain't Markup Language (YAML) 1.0

Yaml의 데이터 기본 표현은 맵핑이다. Key: Value 형태로 Java에서는 Set .Net에서는 Dictionary 자료구조라고 보면 된다.

key: value

Yaml의 자료형으로는

  • string

  • integer

  • blooean

    string: '문자열'
    integer: 1
    boolean: true

시퀀스는 리스트로 표현방식은 하이픈(-) 또는 대괄호로 한다.

list:
- 하나
- 둘

또는

list:[
하나, 둘
]

object 표현은 다음과 같이 한다.

person:
  name: '최용국'
  age: 28 

또는

person{
  name: '최용국',
	age: 28
}

주석은 #으로 표현한다.

#주석입니다.

하나의 파일(stream)에서 여러개의 문서(Document)를 표현할 때 하이픈 세 개로, 끝은 마침표 세 개로 표현한다.

---
첫번째
파일
스트림
...
---
두번째
파일
스트림
...

파일에서 쓰이는 NewLine(\n)을 보존하고 싶을 때는 vertical line( | )을 써준다.

--->
안녕
새로운 줄

NewLine을 띄어쓰기로 치환하고 싶을 떄는 >를 써준다

--->
안녕
띄워쓰기

기댓 값: 안녕 띄워쓰기

앵커와 알리아스로 포인터를 표현할 수 있다.

people:
  - firstperson: &first
    name: 최용국
    age: 28
  - secondperson: &second
    name: 아무개
    age: 30

one: *first
two: *second

one은 key로 firstperson을 value로 갖고있다.


이제 본격적으로 Yaml 파일 포맷을 써보면 Nuget에서 YamlDotNet으로 검색해 나오는 Opensource를 사용할 것 이다. YamlDotNet을 이용해 instance를 serialize, deserialize 하는 방법을 볼 것인데 NewtonJson을 접한 사람들이라면 아주 쉽게 할 수 있다.

class Config

public class Config
{
    public int Integer { get; set; } = 1;
    public string String { get; set; } = "문자열";
    public bool Boolean { get; set; } = true;


    public override string ToString()
    {
        return $"Integer: {Integer}, String: {String}, Boolean: {Boolean}";
    }
}

class FileController

public class FileController
{
    static FileController()
    {
        Instance = new FileController();
    }

    private FileController()
    {

    }

    public static FileController Instance { get; }

    public void Serialize<T>(string fileName, T value)
    {
        var builder = new SerializerBuilder().Build();

        using (var stream = File.Create(fileName))
        {
            using (var writer = new StreamWriter(stream))
            {
                builder.Serialize(writer, value);
            }
        }
    }
    
    public T DeSerialize<T>(string fileName) where T: class
    {
        var builder = new DeserializerBuilder().Build();

        using (var stream = File.Open(fileName, FileMode.Open, FileAccess.Read))
        {
            using (var reader = new StreamReader(stream))
            {
                return builder.Deserialize(reader, typeof(T)) as T;
            }
        }
    }
}

Program

class Program
{
    static void Main(string[] args)
    {
        Config config = new Config()
        {
            Boolean = false,
            Integer = 28,
            String = "최용국"
        };

        Console.WriteLine("==============================================");
        Console.WriteLine($"{config}");
        FileController.Instance.Serialize("config.yaml", config);
        Console.WriteLine("serializer call");
        Console.WriteLine("==============================================");

        var loadConfig = FileController.Instance.DeSerialize<Config>("config.yaml");
        Console.WriteLine("deserializer call");
        Console.WriteLine($"{loadConfig}");
        Console.WriteLine("==============================================");

        Console.ReadLine();
    }
}

결과

config.yaml

Integer: 28
String: 최용국
Boolean: false
profile
코딩합시다.

0개의 댓글