Overview
En esta guía, puedes aprender a usar el driver de MongoDB .NET/C# para realizar la serialización. La serialización es el proceso de mapear un objeto de C# a un documento BSON para su almacenamiento en MongoDB.
Tip
Serialización
Para obtener más información sobre la serialización, consulte Artículo sobreserialización en Wikipedia.
Serializadores
Los serializadores son clases que gestionan la traducción de objetos de C# hacia y desde documentos BSON. Los serializadores implementan... IBsonSerializer
interfaz. El controlador .NET/C# tiene muchos serializadores integrados diseñados para manejar tipos primitivos, tipos de colección y clases personalizadas.
Para ver una lista completa de serializadores disponibles, se puede consultar la Documentación de la API del namespace de serializadores.
Registro de serialización
El registro de serializadores contiene todos los serializadores registrados disponibles para su aplicación. Muchos de los serializadores integrados se registran automáticamente en el registro durante el inicio de la aplicación. Sin embargo, antes de poder usar un serializador personalizado, debe agregarlo al registro, como se muestra en el siguiente ejemplo:
BsonSerializer.RegisterSerializer(new CustomTypeSerializer());
Para acceder al registro del serializador, utilice la propiedad SerializerRegistry de la clase BsonSerializer de la siguiente manera:
var intSerializer = BsonSerializer.SerializerRegistry.GetSerializer<int>();
Importante
El registro del serializador es un registro global. Esto significa que no puedes utilizar varios registros en una sola aplicación.
Serializadores personalizados
En algunos casos, podría ser necesario crear un serializador personalizado. Al crearlo, implemente la clase base abstracta SerializerBase<T> y sobrescriba los métodos Deserialize() y Serialize().
En el siguiente ejemplo de código, se muestra un 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 de suscripción
El driver .NET/C# tiene varias interfaces opcionales que tu clase de serializador personalizada puede implementar, según el tipo de datos que gestione el serializador.
IBsonIdProvider
La interfaz IBsonIdProvider proporciona los métodos GetDocumentId() y SetDocumentId(), y es útil si el objeto que se está serializando utiliza un tipo de _id distinto de ObjectId.
IBsonDocumentSerializer
Implementar la interfaz IBsonDocumentSerializer permite al driver acceder a la información de los nodos del objeto que se está serializando. Esto permite al driver construir correctamente queries con seguridad de tipos al utilizar un serializador personalizado.
IBsonArraySerializer
Implementar la interfaz IBsonArraySerializer permite al driver acceder a la información de serialización de elementos individuales en un arreglo.
Mejorar el rendimiento de la serialización de arreglos
Se puede mejorar el rendimiento de la aplicación representando arreglos de primitivas como estructuras de Memory<T> y ReadOnlyMemory<T> en lugar de utilizar tipos como los arreglos estándar de C# o los objetos BsonArray. El driver implementa rutas rápidas de serialización y deserialización para Memory<T> y ReadOnlyMemory<T>, lo que mejora la velocidad y reduce el uso de memoria.
Nota
Las verificaciones de truncamiento y desbordamiento no son compatibles con Memory<T> o ReadOnlyMemory<T>, pero estas verificaciones se implementan para arreglos estándar.
Puedes lograr estas mejoras de rendimiento almacenando los siguientes tipos primitivos en estructuras de Memory<T> o ReadOnlyMemory<T>:
boolsbytebytecharshortushortintuintlongulongfloatdoubledecimal
El siguiente ejemplo define un POCO Line que contiene campos de arreglo modelados por estructuras Memory y ReadOnlyMemory:
public class Line { public ObjectId Id { get; set; } public Memory<int> X { get; set; } public ReadOnlyMemory<float> Y { get; set; } }
El siguiente documento representa cómo se representa un objeto Line de muestra en MongoDB:
{ "_id": ..., "X": [ 1, 2, 3, 4, 5 ], "Y": [ 1, 1.409999966621399, 1.7300000190734863, 2, 2.240000009536743 ] }
Información Adicional
Para aprender más sobre el uso del driver .NET/C# para serializar objetos de C#, consulta las siguientes páginas:
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: