Visão geral
Neste guia, você pode aprender a usar o driver MongoDB .NET/C# para realizar a serialização. Serialização é o processo de mapeamento de um objeto C# em um documento BSON para armazenamento no MongoDB.
Serializadores
Os serializadores são classes que lidam com a tradução de objetos C# de e para documentos BSON. Os serializadores implementam a interface IBsonSerializer
. O driver .NET/C# tem muitos serializadores integrados feitos para lidar com tipos primitivos, tipos de collection e classes personalizadas.
Para obter uma lista completa dos serializadores disponíveis, consulte a documentação da API do namespace Serializadores.
SerializerRegistry
O registro de serializadores contém todos os serializadores registrados que estão disponíveis para o seu aplicativo. Muitos dos serializadores incorporados são registrados automaticamente no registro de serializadores durante a inicialização do aplicativo. No entanto, antes de usar um serializador personalizado, você deve adicioná-lo ao registro do serializador, conforme mostrado no exemplo a seguir:
BsonSerializer.RegisterSerializer(new CustomTypeSerializer());
Para acessar o registro do serializador, use a propriedade SerializerRegistry
da classe BsonSerializer
da seguinte maneira:
var intSerializer = BsonSerializer.SerializerRegistry.GetSerializer<int>();
Importante
O registro do serializador é um registro global. Ou seja, não é possível usar vários registros em um único aplicativo.
Serializadores personalizados
Em alguns casos, talvez seja necessário criar um serializador personalizado. Ao criar um serializador personalizado, implemente a classe de base abstrata SerializerBase<T>
e substitua os métodos Deserialize()
e Serialize()
.
O exemplo de código a seguir mostra um serializador BsonRegularExpression
personalizado:
class CustomRegularExpressionSerializer : SerializerBase<Regex> { public override Regex Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { var type = context.Reader.GetCurrentBsonType(); 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 override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Regex value) { context.Writer.WriteRegularExpression(value); } }
Interfaces Opt-in
O driver .NET/C# tem várias interfaces opcionais que sua classe de serializador personalizado pode implementar, dependendo do tipo de dados que o serializador manipula.
IBsonIdProvider
A interface IBsonIdProvider fornece os GetDocumentId()
SetDocumentId()
métodos e e é útil se o objeto que você está serializando usa um _id
tipo diferente ObjectId
de.
IBsonDocumentSerializer
A implementação da interface IBsonDocumentSerializer permite que o driver acesse as informações do membro do objeto que você está serializando. Isso permite que o driver construa corretamente queries seguras contra erros de digitação ao usar um serializador personalizado.
IBsonArraySerializer
A implementação da interface IBsonArraySerializer permite que o driver acesse informações de serialização para itens individuais em uma array.
Melhorar o desempenho da serialização da matriz
Você pode melhorar o desempenho do seu aplicativo representando matrizes de primitivos como estruturasMemória<T> eReadOnlyMemory em vez de usar tipos como matrizes C# padrão ou<T> BsonArray
objetos . O driver implementa caminhos rápidos de serialização e desserialização Memory<T>
para ReadOnlyMemory<T>
e, o que aumenta a velocidade e reduz o uso da memória.
Observação
As verificações de truncamento e transbordamento não são suportadas para Memory<T>
ou ReadOnlyMemory<T>
, mas essas verificações são implementadas para arrays padrão.
Você pode efetuar essas melhorias de desempenho armazenando os seguintes tipos primitivos em estruturas Memory<T>
ou ReadOnlyMemory<T>
:
bool
sbyte
byte
char
short
ushort
int
uint
long
ulong
float
double
decimal
O exemplo a seguir define um Line
POCO que contém campos de array modelados pelas estruturas Memory
e ReadOnlyMemory
:
public class Line { public ObjectId Id { get; set; } public Memory<int> X { get; set; } public ReadOnlyMemory<float> Y { get; set; } }
O documento a seguir representa como um objeto Line
de amostra é representado no MongoDB:
{ "_id": ..., "X": [ 1, 2, 3, 4, 5 ], "Y": [ 1, 1.409999966621399, 1.7300000190734863, 2, 2.240000009536743 ] }
Informações adicionais
Para saber mais sobre como usar o driver .NET/C# para serializar objetos C#, consulte as seguintes páginas:
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: