[c#] 직렬화와 이벤트 소싱

이번 포스트에서는 C#에서 직렬화와 이벤트 소싱에 대해 알아보겠습니다.

직렬화(Serialization)

직렬화는 객체를 저장하거나 전송하기 위해 그 상태를 변환하는 과정을 의미합니다. C#에서는 System.Runtime.Serialization 네임스페이스를 활용하여 객체를 직렬화하고 역직렬화할 수 있습니다.

아래는 DataContractDataMember 어트리뷰트로 객체를 직렬화하는 간단한 예제 코드입니다.

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

[DataContract]
class Person
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        MemoryStream stream = new MemoryStream();
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person));

        Person person = new Person { Name = "John", Age = 30 };
        
        serializer.WriteObject(stream, person);
        stream.Position = 0;

        StreamReader reader = new StreamReader(stream);
        Console.WriteLine(reader.ReadToEnd());
    }
}

이벤트 소싱(Event Sourcing)

이벤트 소싱은 시스템의 상태를 변경하는 모든 동작을 이벤트의 시퀀스로 저장하는 패턴입니다. C#에서는 System.Reactive 네임스페이스와 EventStream 클래스를 사용하여 이벤트 소싱을 구현할 수 있습니다.

아래는 간단한 이벤트 소싱 예제 코드입니다.

using System;
using System.Reactive.Linq;

class Program
{
    static void Main(string[] args)
    {
        var eventStream = new EventStream();

        var subscription = eventStream
            .OfType<SomeEvent>()
            .Subscribe(e => Console.WriteLine($"Received event: {e.Message}"));

        eventStream.Publish(new SomeEvent { Message = "Hello, World!" });
    }
}

class EventStream : IObservable<object>
{
    private readonly Subject<object> _subject = new Subject<object>();

    public IDisposable Subscribe(IObserver<object> observer)
    {
        return _subject.Subscribe(observer);
    }

    public void Publish(object @event)
    {
        _subject.OnNext(@event);
    }
}

class SomeEvent
{
    public string Message { get; set; }
}

이렇게 C#에서는 쉽게 직렬화와 이벤트 소싱을 구현할 수 있습니다. 계속해서 이러한 기술들을 활용하여 실제 프로젝트에 적용해보는 것을 권장합니다.

더 많은 정보를 원하시면 아래 참고 자료를 확인해주세요.

참고 자료: