Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver C#/ .NET

Serialização

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.

Dica

Serialização

Para saber mais sobre serialização, consulte o artigoSerialização na Wikipedia.

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.

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 delegado ObjectSerializer.DefaultAllowedTypes(). 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 para true os tipos que você deseja incluir. Em seguida, adicione esta expressão ao final do delegado que você passa para o construtor ObjectSerializer.

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.

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.

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);
}
}

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.

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.

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.

A implementação da interface IBsonArraySerializer permite que o driver acesse informações de serialização para itens individuais em uma array.

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 ]
}

Para saber mais sobre como usar o driver .NET/C# para serializar objetos C#, consulte as seguintes páginas:

  • Mapeamento de classe

  • POCOs

  • Objetos polimórficos

  • GUIDs

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

TLS/SSL

Nesta página