Ho una soluzione pulita utilizzando IBsonSerializer e Newtonsoft.Json personalizzati.
Imposta il tuo serializzatore personalizzato sul BsonClassMap
map.MapProperty(member => member.Data)
.SetElementName("Data")
.SetSerializer(new DynamicSerializer());
o sulla proprietà
[BsonSerializer(typeof(DynamicSerializer))]
public dynamic Data { get; set; }
E proprio includono la seguente classe
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
fonte
2014-04-23 12:18:32
Grazie Craig, ho trovato un modo per farlo funzionare. controlla qui https://groups.google.com/forum/?fromgroups#!topic/mongodb-user/AEIfBP9IWQw – hoang
Sì, l'ho visto. Farò eco qui per gli utenti SO. Funziona bene, ma richiede una modifica di basso livello al nucleo.Il modo in cui ho presentato sopra è un carico laterale e realizza la stessa cosa senza modificare il nucleo. Ovviamente, ci sono alcune differenze, ma la maggior parte del modo lì. Dopotutto è solo un picco, quindi ... –
Dai un'occhiata a [MongoDB.Dynamic] (http://www.assembla.com/spaces/mongodb-dynamic/wiki). Utilizza il driver ufficiale MongoDB e ha un approccio di utilizzo delle interfacce con la dinamica di C# 4.0. –