KeiStory

C# ArvoConvert 사용하기

 

Avro는 Apache에서 만든 프레임워크로 데이터 직렬화 기능을 제공합니다.

언어 중립적인 데이터 직렬화 시스템으로 JSON과 비슷하지만 Avro는 스키마가 존재한다는 차이점이 있으며

압축률이 좋고 암호화 처리가 되어있어서 서버 간 통신에 보안을 원한다면 사용하기 좋습니다.

대량의 데이터를 처리할 때 사용하면 사이즈를 많이 줄일 수 있습니다.

 

아래 깃헙페이지를 설명을 보면 Json 보다 속도나 압축률이 좋은것을 알 수 있습니다.

(소개 페이지라 믿을수는 없..)

https://github.com/AdrianStrugala/AvroConvert

 

GitHub - AdrianStrugala/AvroConvert: Rapid Avro serializer for C# .NET

Rapid Avro serializer for C# .NET. Contribute to AdrianStrugala/AvroConvert development by creating an account on GitHub.

github.com

C# 으로 만들어진 ArvoConvert는 아래처럼 많은 기능을 지원하고 있습니다.

 

상업적 용도로 사용할 경우 라이센스를 구매해야 합니다.
 
아래는 사용하는 방법입니다.

1. Nuget에서 'AvroConvert'를 설치합니다.

 
2. 직렬화/역직렬화 하기

TestData Class를 정의해 이를 사용하는 방법입니다.

using SolTechnology.Avro;

namespace AvroConvertTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TestData testData = new()
            {
                ID = 0,
                Name = "Kang",
                Age = 30,
                Birth = DateTime.Parse("2000-09-18"),
                Address = "경기도 수원시",
                CrateTime = DateTime.Now
            };

            // 직렬화
            byte[] arvoObject = AvroConvert.Serialize(testData);

            // 역직렬화
            TestData deserializedObject = AvroConvert.Deserialize<TestData>(arvoObject);

            Console.WriteLine("");
            Console.WriteLine("◆ Avro 개체에서 스키마 읽기");
            string schemaInJsonFormat = AvroConvert.GetSchema(arvoObject);
            Console.WriteLine(schemaInJsonFormat);

            Console.WriteLine("");
            Console.WriteLine("◆ 대량 Avro 객체 컬렉션을 하나씩 역직렬화");
            List<TestData> testDatas = new();

            for (int i = 0; i < 100; i++)
            {
                testDatas.Add(new TestData()
                {
                    ID = i,
                    Name = "Kang_" + i,
                    Age = 30,
                    Birth = DateTime.Parse("2000-09-18"),
                    Address = "경기도 수원시",
                    CrateTime = DateTime.Now
                });
            }

            byte[] arvoObjects = AvroConvert.Serialize(testDatas);

            using (var reader = AvroConvert.OpenDeserializer<TestData>(new MemoryStream(arvoObjects)))
            {
                while (reader.HasNext())
                {
                    var item = reader.ReadNext();
                    Console.WriteLine(item.Name);
                }
            }

            Console.WriteLine("");
            Console.WriteLine("◆ Avro 객체에서 C# 모델 생성");
            string resultModel = AvroConvert.GenerateModel(arvoObject);
            Console.WriteLine(resultModel);

            Console.WriteLine("");
            Console.WriteLine("◆ Avro 객체를 JSON으로 변환");
            var resultJson = AvroConvert.Avro2Json(arvoObject);
            Console.WriteLine(resultJson);

            Console.ReadKey();
        }
    }

    public class TestData
    {
        public int ID { get; set; }
        public string? Name { get; set; }
        public int Age { get; set; }
        public DateTime Birth { get; set; }
        public string? Address { get; set; }
        public DateTime CrateTime { get; set; }

    }
}

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band