Tengo una solución limpia utilizando el servicio personalizado IBsonSerializer y Newtonsoft.Json.
Configuración de su serializador personalizado en el BsonClassMap
map.MapProperty(member => member.Data)
.SetElementName("Data")
.SetSerializer(new DynamicSerializer());
o en la propiedad
[BsonSerializer(typeof(DynamicSerializer))]
public dynamic Data { get; set; }
Y basta con incluir la siguiente clase
public class DynamicSerializer : IBsonSerializer
{
#region Implementation of IBsonSerializer
public object Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options)
{
return Deserialize(bsonReader, nominalType, null, options);
}
public object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType,
IBsonSerializationOptions options)
{
if (bsonReader.GetCurrentBsonType() != BsonType.Document) throw new Exception("Not document");
var bsonDocument = BsonSerializer.Deserialize(bsonReader, typeof(BsonDocument), options) as BsonDocument;
return JsonConvert.DeserializeObject<dynamic>(bsonDocument.ToJson());
}
public IBsonSerializationOptions GetDefaultSerializationOptions()
{
return new DocumentSerializationOptions();
}
public void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
{
var json = (value == null) ? "{}": JsonConvert.SerializeObject(value);
BsonDocument document = BsonDocument.Parse(json);
BsonSerializer.Serialize(bsonWriter, typeof(BsonDocument), document,options);
}
#endregion
}
InfoSlips - GlobalKinetic
Gracias Craig, he encontrado una manera de hacer que funcione. mira aquí https://groups.google.com/forum/?fromgroups#!topic/mongodb-user/AEIfBP9IWQw – hoang
Sí, lo vi. Voy a hacer un eco aquí para los usuarios de SO. Eso funciona bien, pero requiere una modificación de bajo nivel en el núcleo.La forma que presenté arriba es una carga lateral y logra lo mismo sin modificar el núcleo. Obviamente, hay algunas diferencias, pero se lleva la mayor parte del camino hasta allí. Es solo un pico después de todo, así que ... –
Eche un vistazo a [MongoDB.Dynamic] (http://www.assembla.com/spaces/mongodb-dynamic/wiki). Utiliza el controlador oficial de MongoDB y adopta un enfoque de uso de interfaces con la dinámica de C# 4.0. –