개요
이 가이드에서는 MongoDB .NET/C# 드라이버를 사용하여 직렬화를 수행하는 방법을 배울 수 있습니다. 직렬화는 MongoDB에 저장하기 위해 C# 객체를 BSON 문서에 매핑하는 프로세스입니다.
Serializer
직렬 변환기는 C# 객체와 BSON 문서 간의 변환을 처리하는 클래스입니다. 직렬 변환기는 IBsonSerializer
인터페이스를 구현합니다. .NET/C# 드라이버에는 기본 유형, collection 유형 및 사용자 지정 클래스를 처리하기 위해 만들어진 많은 내장 직렬 변환기가 있습니다.
사용 가능한 직렬 변환기의 전체 목록은 직렬 변환기 네임스페이스 API 문서를 참조하세요.
ObjectSerializer
ObjectSerializer
클래스는 안전하다고 간주되는 유형의 직렬화 및 역직렬화만 허용합니다. ObjectSerializer
를 구성할 때 Func<Type, bool>
유형의 위임을 전달할 수 있습니다. 이 위임은 객체 유형을 허용하고 해당 유형이 직렬화에 안전한지 여부를 나타내는 부울 값을 반환합니다.
대부분의 경우 ObjectSerializer.DefaultAllowedTypes()
위임을 전달합니다. 이 메서드는 안전하다고 판단한 몇 가지 잘 알려진 프레임워크 유형에 대해 true를 반환합니다. 사용자 지정 유형을 직렬화하려면 포함하려는 유형에 대해 true
로 평가하는 부울 표현식 만듭니다. 그런 다음 ObjectSerializer
생성자에 전달하는 위임의 끝에 이 표현식 추가합니다.
다음 예에서는 ObjectSerializer
가 ObjectSerializer.DefaultAllowedTypes()
에서 허용되거나 전체 이름이 "MyNamespace"
로 시작하는 모든 유형을 직렬화 및 역직렬화합니다.
var objectSerializer = new ObjectSerializer(type => ObjectSerializer.DefaultAllowedTypes(type) || type.FullName.StartsWith("MyNamespace")); BsonSerializer.RegisterSerializer(objectSerializer);
익명 유형을 직렬화하도록 허용하려면 다음 예와 같이 부울 표현식 type.FullName.StartsWith("<>f__AnonymousType"))
을 위임에 추가합니다.
var objectSerializer = new ObjectSerializer(type => ObjectSerializer.DefaultAllowedTypes(type) || type.FullName.StartsWith("<>f__AnonymousType")); BsonSerializer.RegisterSerializer(objectSerializer);
다른 작업을 수행하기 전에 프로그램 시작 시 ObjectSerializer
를 생성하고 등록합니다.
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 구현 인터페이스를 사용하면 드라이버가 배열의 개별 항목에 대한 직렬화 정보에 액세스할 수 있습니다.
배열 직렬화 성능 향상
<T> 표준 C# BsonArray
배열이나 객체와 같은 유형을 사용하는 대신프리미티브 배열을 Memory 및 ReadOnlyMemory 구조체로 표시하여<T> 애플리케이션의 성능을 향상시킬 수 있습니다. 운전자 Memory<T>
및 ReadOnlyMemory<T>
에 대한 빠른 직렬화 및 역직렬화 경로를 구현하여 속도를 높이고 메모리 사용량을 줄입니다.
참고
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 ] }
추가 정보
.NET/C# 드라이버를 사용하여 C# 객체를 직렬화하는 방법에 대해 자세히 알아보려면 다음 페이지를 참조하세요.
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.