직렬화
이 페이지의 내용
개요
이 가이드에서는 MongoDB .NET/C# 드라이버를 사용하여 직렬화를 수행하는 방법을 배울 수 있습니다. 직렬화는 MongoDB에 저장하기 위해 C# 객체를 BSON 문서에 매핑하는 프로세스입니다.
Serializer
직렬 변환기는 C# 객체와 BSON 문서 간의 변환을 처리하는 클래스입니다. 직렬 변환기는 IBsonSerializer
인터페이스를 구현합니다. .NET/C# 드라이버에는 기본 유형, collection 유형 및 사용자 지정 클래스를 처리하기 위해 만들어진 많은 내장 직렬 변환기가 있습니다.
사용 가능한 직렬 변환기의 전체 목록은 직렬 변환기 네임스페이스 API 문서를 참조하세요.
Serializer 레지스트리
직렬 변환기 레지스트리에는 애플리케이션 에서 사용할 수 있는 모든 등록된 직렬 변환기가 포함되어 있습니다. 대부분의 내장 직렬 변환기는 애플리케이션 스타트업 시 직렬 변환기 레지스트리에 자동으로 등록됩니다.
직렬 변환기 등록
사용자 지정 직렬 변환기를 사용하려면 먼저 다음 예시 와 같이 직렬 변환기 레지스트리에 추가해야 합니다.
BsonSerializer.RegisterSerializer(new CustomTypeSerializer());
직렬 변환기를 등록하면 운전자 이를 사용하여 직렬 변환기에 의해 매핑된 모든 값을 직렬화합니다.
레지스트리에서 직렬 변환기에 액세스
레지스트리에서 특정 직렬 변환기에 액세스 하려면 다음과 같이 BsonSerializer
클래스의 SerializerRegistry
속성 사용합니다.
var intSerializer = BsonSerializer.SerializerRegistry.GetSerializer<int>();
중요
직렬 변환기 레지스트리는 글로벌 레지스트리입니다. 즉, 단일 애플리케이션에서 여러 개의 레지스트리를 사용할 수 없습니다.
사용자 지정 직렬 변환기
사용자 지정 직렬 변환기를 만들려면 IBsonSerializer
기본 클래스를 구현 ValueType
멤버를 설정하다 다음 Deserialize()
및 Serialize()
메서드를 재정의합니다.
다음 코드 예시에서는 사용자 지정 BsonRegularExpression
직렬 변환기를 보여줍니다.
class CustomRegularExpressionSerializer : IBsonSerializer { public Type ValueType => typeof(Regex); public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { var type = context.Reader.CurrentBsonType; switch (type) { case BsonType.RegularExpression: return context.Reader.ReadRegularExpression().AsRegex; case BsonType.String: var pattern = context.Reader.ReadString() return new Regex(pattern); default: throw new NotSupportedException($"Cannot convert a {type} to a RegularExpression."); } } public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) { var regex = (Regex) value; context.Writer.WriteRegularExpression(regex); } }
옵트인 인터페이스
.NET/C# 드라이버에는 직렬 변환기가 처리하는 데이터 유형에 따라 사용자 지정 직렬 변환기 클래스가 구현할 수 있는 몇 가지 선택적 인터페이스가 있습니다.
IBsonIdProvider
IBsonIdProvider 인터페이스는 및 메서드를 GetDocumentId()
SetDocumentId()
제공하며, 직렬화하려는 객체가 이외의 _id
유형을 사용하는 경우 ObjectId
유용합니다.
IBsonDocumentSerializer
IBsonDocumentSerializer 구현 인터페이스를 사용하면 드라이버가 직렬화하려는 객체의 멤버 정보에 액세스할 수 있습니다. 이를 통해 드라이버는 사용자 지정 직렬 변환기를 사용할 때 형식이 안전한 쿼리를 올바르게 구성할 수 있습니다.
IBsonArraySerializer
IBsonArraySerializer 구현 인터페이스를 사용하면 드라이버가 배열의 개별 항목에 대한 직렬화 정보에 액세스할 수 있습니다.
컨벤션
규칙 팩을 사용하면 운전자 직렬화 중에 사용하는 클래스와 해당 멤버에 규칙을 정의하고 적용 할 수 있습니다. 규칙은 각 클래스를 속성으로 장식하지 않고도 C# 객체와 MongoDB 문서 간에 데이터를 매핑하는 방법을 지정합니다.
.NET/ C# 드라이버 직렬화 프로세스 사용자 지정하는 데 사용할 수 있는 내장 규칙을 제공합니다. 다음 표에서는 몇 가지 내장 규칙에 대해 설명합니다.
규칙 | 설명 |
---|---|
직렬화 및 역직렬화 중에 요소 이름을 카멜 표기법으로 변환합니다. | |
직렬화 및 역직렬화 중에 열거형 값을 지정된 표현으로 변환합니다. | |
역직렬화 중에 문서 의 예비 요소를 무시할지 여부를 지정합니다. | |
객체 직렬 변환기를 사용하여 직렬화할 수 있는 유형을 지정합니다. |
사용 가능한 규칙의 전체 목록을 보려면 API 설명서에서 규칙 클래스 참조를 확인하세요.
다음 예시 와 같이 지정된 규칙을 사용하여 ConventionPack
를 인스턴스화한 다음 ConventionRegistry.Register()
메서드에 전달하여 규칙을 등록할 수 있습니다.
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCaseConvention", camelCaseConvention, t => true);
배열 직렬화 성능 향상
<T> 표준 C# 배열이나 BsonArray
객체와 같은 유형을 사용하는 대신 프리미티브 Memory<T>
ReadOnlyMemory<T>
배열을Memory<T> 및 ReadOnlyMemory 구조체로 표시하여 애플리케이션의 성능을 향상시킬 수 있습니다. 운전자 및 에 대한 빠른 직렬화 및 역직렬화 경로를 구현하여 속도를 높이고 메모리 사용량을 줄입니다.
참고
Memory<T>
또는 ReadOnlyMemory<T>
에 대해서는 잘라내기 및 오버플로 검사가 지원되지 않지만, 이러한 검사는 표준 배열에 대해 구현됩니다.
다음 기본 유형을 Memory<T>
또는 ReadOnlyMemory<T>
구조체에 저장하면 이러한 성능 향상 효과를 얻을 수 있습니다.
bool
sbyte
byte
char
short
ushort
int
uint
long
ulong
float
double
decimal
다음 예시 Memory
및 ReadOnlyMemory
구조체로 모델링된 배열 필드를 포함하는 Line
POCO를 정의합니다.
public class Line { public ObjectId Id { get; set; } public Memory<int> X { get; set; } public ReadOnlyMemory<float> Y { get; set; } }
다음 문서 샘플 Line
객체 MongoDB 에서 표현되는 방식을 나타냅니다.
{ "_id": ..., "X": [ 1, 2, 3, 4, 5 ], "Y": [ 1, 1.409999966621399, 1.7300000190734863, 2, 2.240000009536743 ] }
팁
모델 벡터
Atlas Vector Search 큰 숫자 배열을 만들고 쿼리하는 작업이 포함됩니다. 애플리케이션 에서 Atlas Vector Search 사용하는 경우 Memory
및 ReadOnlyMemory
를 사용하여 임베딩 및 쿼리 벡터의 배열 표현을 저장 하면 성능 향상의 이점을 누릴 수 있습니다. 자세한 학습 은 Atlas Vector Search 가이드 에서 지원되는 벡터 임베딩 유형을 참조하세요.
추가 정보
.NET/C# 드라이버를 사용하여 C# 객체를 직렬화하는 방법에 대해 자세히 알아보려면 다음 페이지를 참조하세요.
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.