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을 접한 사람들이라면 아주 쉽게 할 수 있다.
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}";
}
}
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;
}
}
}
}
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