Avro는 Apache에서 만든 프레임워크로 데이터 직렬화 기능을 제공합니다.
언어 중립적인 데이터 직렬화 시스템으로 JSON과 비슷하지만 Avro는 스키마가 존재한다는 차이점이 있으며
압축률이 좋고 암호화 처리가 되어있어서 서버 간 통신에 보안을 원한다면 사용하기 좋습니다.
대량의 데이터를 처리할 때 사용하면 사이즈를 많이 줄일 수 있습니다.
아래 깃헙페이지를 설명을 보면 Json 보다 속도나 압축률이 좋은것을 알 수 있습니다.
(소개 페이지라 믿을수는 없..)
https://github.com/AdrianStrugala/AvroConvert
C# 으로 만들어진 ArvoConvert는 아래처럼 많은 기능을 지원하고 있습니다.
상업적 용도로 사용할 경우 라이센스를 구매해야 합니다.
아래는 사용하는 방법입니다.
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; }
}
}
C# MemoryPack (0) | 2024.03.06 |
---|---|
C# Liquid Template 사용한 동적 쿼리 만들기 - Fluid (0) | 2024.03.05 |
C# Indexer 사용하기 (0) | 2024.03.04 |
C# NATS 를 이용해 Streaming Server 구성하기 (0) | 2024.03.03 |
C# Quartz Scheduler 사용하기 - Cron 표기법 사용 (0) | 2024.02.29 |