Set MongoDB zu Serialisieren einer Klasse als BsonDocument

Ich habe eine Dictionary<string, object> als INSERT-Eingang für MongoDB.Save().

Wenn ich füllen Sie dieses Wörterbuch mit primitiven Typen - die Serialisierungs-Prozess funktioniert gut, aber wenn ich versuche, einfügen mein Wörterbuch, gefüllt mit einige benutzerdefinierte Klasse (z.B. Klasse "Person") bin ich immer der nächste Fehler:
.NET type 'Person' cannot be mapped to a BsonValue

Bemerkte ich, dass, wenn ich stecken meine benutzerdefinierten Typ umgewandelt BsonDocument den serialisierungsvorgang große Arbeit.

Wie kann ich festlegen, MongoDB serialisieren, die eine bestimmte Klasse als BsonDocument?


Update: real code

    here is my SensorData class: 

    [DataContract]
    public class SensorData
    {

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public string Type { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public string Desc { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public SensorStatus Status { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public string Value { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.String)]
        public string ValueUnits { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.Boolean)]
        public bool Event { get; set; }

        [DataMember]
        [BsonElement]
        [BsonRepresentation(BsonType.Int32)]
        public int TTL { get; set; }
    }

Hier ist die Methoden, die speichert die Daten in MongoDB:

public void Save(Dictionary<string, object> RawSensorMessageDictionary)
        {          
            try
            {
                var policyColl = new MongoClient(ConnString).GetServer().GetDatabase(DB_NAME).GetCollection<BsonDocument>(CollectionNames.RawSensorMessage.ToString());


                if (!RawSensorMessageDictionary.Any(p => p.Key == "_id")) //if rawSensorMessageID is empty, mongodb will set it
                    RawSensorMessageDictionary.Add("_id", ObjectId.GenerateNewId().ToString());
                var bsonObj = new BsonDocument(RawSensorMessageDictionary);
                policyColl.Save(bsonObj);

            }
            catch (Exception ex)
            {
                   //log exception
            }
        }

Und hier ist der code von meinem UnitTest:

            DataAccess.MongoDAL dal = new DataAccess.MongoDAL();
            Dictionary<string, object> dic = new Dictionary<string, object>();
            dic.Add("1", true);
            dic.Add(Message.RESOURCE_TYPE, "aaa");
            dic.Add(Message.RESOURCE_NAME, "bbb");
            dic.Add(Message.SENSOR_DATA, new SensorData { Desc = "aaa", Event = true, Status = SensorStatus.Active, TTL = 4, Type = "sss", Value = "222" });
            dal.SaveRawSensorData(dic );

Ich möchte, dass meine app zu Serialisieren automatisch SensorData Objekt BsonDocument. Wenn ich nicht mache es manuell, ich bekomme die folgende exception: .NET type 'SensorData' cannot be mapped to a BsonValue

Wie soll ich es tun?


Update 2:
OK das Problem entdeckt, In meinem "save to db" Methode, die ich verwendete den folgenden code, um meine konvertieren Wörterbuch BsonDocument:

        var bsonObj = new BsonDocument(RawSensorMessageDictionary);

Ich würde erwarten, dass die Schaffung einer neuen Instanz von 'BsonDocument' aus anderen Objekt behandeln die Konvertierung genau wie object.ToBsonDocument() tut es aber scheinbar nicht.

Schließlich ersetzte ich den obigen code die folgende:

    var bsonObj = RawSensorMessageDictionary.ToBsonDocument();
    dal.SaveRawSensorData(dic );

jetzt funktioniert es.

InformationsquelleAutor Ofir | 2014-10-26
Schreibe einen Kommentar