Ich habe eine saubere Lösung mit benutzerdefinierten IBsonSerializer und Newtonsoft.Json.
Richten Sie Ihre individuelle Serializer auf der BsonClassMap
map.MapProperty(member => member.Data)
.SetElementName("Data")
.SetSerializer(new DynamicSerializer());
oder auf dem Grundstück
[BsonSerializer(typeof(DynamicSerializer))]
public dynamic Data { get; set; }
Und sind nur die folgenden Klasse
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
Dank Craig, fand ich einen Weg, es funktioniert. Check here https://groups.google.com/forum/?fromgroups#!topic/mongodb-user/AEIfBP9IWQw – hoang
Ja, das habe ich gesehen. Ich werde hier für SO Benutzer Echo. Das funktioniert gut, erfordert aber eine geringe Änderung des Kerns.Die Art und Weise, wie ich oben dargestellt habe, ist eine Seitenlast und führt das gleiche aus, ohne den Kern zu verändern. Offensichtlich gibt es einige Unterschiede, aber es kommt den meisten Weg dorthin. Es ist nur ein Spike, also ... –
Werfen Sie einen Blick auf [MongoDB.Dynamic] (http://www.assembla.com/spaces/mongodb-dynamic/wiki). Es verwendet den offiziellen Treiber von MongoDB und verwendet einen Ansatz zur Verwendung von Schnittstellen mit der Dynamik von C# 4.0. –