YamlDotNet Part.2

최용국·2020년 3월 24일
0

오픈소스

목록 보기
2/2

YamlDotNet Part.2

YamlDotNet 사용법 두 번째 설명은 생략하고 바로 코드로 갑니다. 첫 번째는 아래 링크를 따라가시면 됩니다.

YamlDotNet Part.1

클래스를 직렬화 역직렬화 하는 것이 아니라 값 그대로 직렬화 역직렬화를 하는방법. 기본적으로 자료형은 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를 활용하면 된다.

class Config

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 속성을 사용하면 된다.

class Config

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 코드에서 이어서 하는 부분이 있으니 참고해야 합니다.

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("==============================================");

				//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,
//}
profile
코딩합시다.

0개의 댓글