Jeu de MongoDB pour Sérialiser une classe comme BsonDocument

J'ai un Dictionary<string, object> comme une insertion d'entrée pour MongoDB.Save().

Quand je remplir ce dictionnaire avec les types primitifs - le processus de sérialisation fonctionne très bien mais lorsque j'essaie d'insérer mon dictionnaire rempli avec une certaine classe personnalisée (par exemple, la classe Personne) j'obtiens l'erreur suivante:
.NET type 'Person' cannot be mapped to a BsonValue

J'ai remarqué que si j'insère mon type personnalisé converti à BsonDocument le processus de sérialisation de l'excellent travail.

Comment puis-je définir MongoDB pour sérialiser une classe particulière comme BsonDocument?


Mise à jour: real code fourni

    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; }
    }

Voici les méthodes qui enregistre les données dans 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
            }
        }

Et voici le code de mon 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 );

Je veux que mon application pour Sérialiser automatiquement SensorData objet de BsonDocument. Si je ne suis pas le faire manuellement, je suis l'exception suivante: .NET type 'SensorData' cannot be mapped to a BsonValue

Comment dois je faire?


Mise à jour 2:
OK trouvé le problème, Dans mon "enregistrer dans la base de données" méthode que j'ai utilisé le code suivant dans le but de convertir mon dictionnaire BsonDocument:

        var bsonObj = new BsonDocument(RawSensorMessageDictionary);

Je m'attends à ce que la création d'une nouvelle instance de "BsonDocument" à partir d'un autre objet sera de gérer la conversion exactement comme object.ToBsonDocument() n'mais apparemment, il ne l'est pas.

Enfin, j'ai remplacé le code ci-dessus à la suivante:

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

maintenant ça fonctionne.

InformationsquelleAutor Ofir | 2014-10-26