YamlDotNet 사용법 두 번째 설명은 생략하고 바로 코드로 갑니다. 첫 번째는 아래 링크를 따라가시면 됩니다.
클래스를 직렬화 역직렬화 하는 것이 아니라 값 그대로 직렬화 역직렬화를 하는방법. 기본적으로 자료형은 Dictionary<object, object>다.
Serializer serializer = new Serializer();
Dictionary<object, object> values = new Dictionary<object, object>()
{
{ "Name", "최용국"},
{ "Age", 28 }
};
using (var stream = File.Open("config2.yaml", FileMode.Create, FileAccess.Write))
{
using (var writer = new StreamWriter(stream))
{
serializer.Serialize(writer, values);
}
}
Deserializer deserializer = new Deserializer();
using (var streamReader = new StreamReader(File.Open("config2.yaml", FileMode.Open, FileAccess.Read)))
{
var value = deserializer.Deserialize(streamReader);
values = value as Dictionary<object, object>;
foreach(var keyValue in values)
{
Console.WriteLine($"key: {keyValue.Key} value: {keyValue.Value}");
}
}
클래스 직렬화할 때 직렬화에서 뺴고 싶다면 YamlIgnoreAttribute를 활용하면 된다.
public class Config
{
public int Integer { get; set; } = 1;
public string String { get; set; } = "문자열";
public bool Boolean { get; set; } = true;
[YamlIgnore()]
public string Ignore { get; set; }
}
만약 클래스에서 쓰고 있는 Property의 이름이 Key가 아닌 다른 이름으로 Key를 쓰고 싶다면 YamlMemberAttribute의 Alias 속성을 사용하면 된다.
public class Config
{
public int Integer { get; set; } = 1;
public string String { get; set; } = "문자열";
public bool Boolean { get; set; } = true;
[YamlIgnore()]
public string Ignore { get; set; }
[YamlMember(Alias = "m")]
public string Member { get; set; } = "최용국";
}
// 기대 값
// Integer: 1
// String: '문자열'
// Boolean: true
// m: 최용국
Property의 순서를 정하고 싶다면 YamlMemberAttribute의 Order 속성을 사용하면 된다. 여기서 주의해야 할 점은 YamlMemberAttribute 전부 정의해 줘야 의도한 대로 출력될 수 있다.
public class Config
{
[YamlMember(Order = 2)]
public int Integer { get; set; } = 1;
[YamlMember(Order = 3)]
public string String { get; set; } = "문자열";
[YamlMember(Order = 4)]
public bool Boolean { get; set; } = true;
[YamlIgnore()]
public string Ignore { get; set; }
[YamlMember(Alias = "m", Order = 1)]
public string Member { get; set; } = "최용국";
}
// 기대 값
// m: 최용국
// Integer: 1
// String: '문자열'
// Boolean: true
그리고 다른 플랫폼과의 데이터 교환은 Json Format이 유리한데 Convert를 내부 함수로 지원한다. 지난 YamlDotNet Part.1 코드에서 이어서 하는 부분이 있으니 참고해야 합니다.
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("==============================================");
//Json Serialize 부분
var serialize = new SerializerBuilder().JsonCompatible().Build();
var jsonSerialize = serialize.Serialize(loadConfig);
using (var stream = File.Create("config.json"))
{
using (var writer = new StreamWriter(stream))
{
writer.Write(jsonSerialize);
}
}
}
}
//config.json 파일
//{
// "Boolean": false,
// "String": "최용국",
// "Integer": 28,
//}