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.
ObjectSerializer
A classe ObjectSerializer
permite serialização e desserialização somente dos tipos que são considerados seguros. Ao construir um ObjectSerializer
, você pode passar um delegado do tipo Func<Type, bool>
. Este delegado aceita um tipo de objeto e retorna um valor booleano indicando se o tipo é seguro para serialização.
Na maioria dos casos, passe no ObjectSerializer.DefaultAllowedTypes()
delegado. Este método retorna verdadeiro para vários tipos de estruturas conhecidas que consideramos seguras. Para serializar tipos personalizados, crie uma expressão booleana que avalia true
para os tipos que você deseja incluir. Em seguida, adicione esta expressão ao final do delegado que você passa para o ObjectSerializer
construtor .
No exemplo abaixo, o ObjectSerializer
serializará e desserializará qualquer tipo permitido pelo ObjectSerializer.DefaultAllowedTypes()
ou cujo nome completo comece com "MyNamespace"
:
var objectSerializer = new ObjectSerializer(type => ObjectSerializer.DefaultAllowedTypes(type) || type.FullName.StartsWith("MyNamespace")); BsonSerializer.RegisterSerializer(objectSerializer);
Para permitir que tipos anônimos sejam serializados, adicione a expressão boolean type.FullName.StartsWith("<>f__AnonymousType"))
ao seu delegado, como indicado no exemplo abaixo:
var objectSerializer = new ObjectSerializer(type => ObjectSerializer.DefaultAllowedTypes(type) || type.FullName.StartsWith("<>f__AnonymousType")); BsonSerializer.RegisterSerializer(objectSerializer);
Crie e registre seu ObjectSerializer
no início do seu programa, antes de fazer qualquer outra coisa.
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.
Registrar um serializador
Antes de usar um serializador personalizado, você deve adicioná-lo ao registro do serializador, conforme mostrado no exemplo a seguir:
BsonSerializer.RegisterSerializer(new CustomTypeSerializer());
Depois de registrar o serializador, o driver o usa para serializar quaisquer valores mapeados pelo serializador.
Acessar um serializador a partir do registro
Para acessar um serializador específico do registro, use a propriedade SerializerRegistry
da classe BsonSerializer
da seguinte forma:
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
Para criar seu próprio serializador personalizado, implemente a classe base IBsonSerializer
, defina o membro ValueType
e substitua os métodos Deserialize()
e Serialize()
.
O exemplo de código a seguir mostra um serializador BsonRegularExpression
personalizado:
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); } }
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
O IBsonIdProvider interface fornece os GetDocumentId()
SetDocumentId()
métodos e , e é útil se o objeto que você está serializando usa um _id
tipo diferente de ObjectId
.
IBsonDocumentSerializer
Implementando o IBsonDocumentSerializer permite que o driver acesse as informações de 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
Implementando o IBsonArraySerializer permite que o driver acesse informações de serialização para itens individuais em uma array.
Convenções
Os pacotes de convenções permitem definir e aplicar convenções às suas classes e seus membros que o driver usa durante a serialização. As convenções especificam como os dados são mapeados entre seus objetos C# e documentos MongoDB sem exigir que você decore cada classe com atributos.
O driver .NET/C# fornece convenções internas que você pode usar para personalizar o processo de serialização . A tabela a seguir descreve algumas das convenções integradas:
convenção | Descrição |
---|---|
Converte nomes de elementos em camel case durante a serialização e desserialização. | |
Converte valores de enumeração em uma representação especificada durante a serialização e desserialização. | |
Especifica se os elementos extras em um documento devem ser ignorados durante a desserialização. | |
Especifica quais tipos podem ser serializados usando um serializador de objeto . |
Para visualizar uma lista completa de convenções disponíveis, consulte a referência da classe Convenções na documentação da API.
Você pode registrar uma convenção instanciando um ConventionPack
com as convenções especificadas e, em seguida, passando-a para o método ConventionRegistry.Register()
, conforme mostrado no exemplo a seguir:
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCaseConvention", camelCaseConvention, t => true);
Melhorar o desempenho da serialização da matriz
Você pode melhorar o desempenho do seu aplicativo representando matrizes de primitivos como estruturas Memória<T> e ReadOnlyMemory<T> em vez de usar tipos como matrizes C# padrão ou objetos BsonArray
. O driver implementa caminhos rápidos de serialização e desserialização para Memory<T>
e ReadOnlyMemory<T>
, 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 ] }
Dica
Vetores de modelo
Executar uma query do Atlas Vector Search envolve criar e consultar grandes arrays numéricos. Se o seu aplicação usar o Atlas Vector Search, você poderá se beneficiar das melhorias de desempenho do uso Memory
ReadOnlyMemory
de e para armazenar representações de array de incorporações e vetores de consulta. Para saber mais, consulte Tipos de incorporação de vetor suportados no guia Atlas Vector Search .
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: