【发布时间】:2014-12-21 19:28:35
【问题描述】:
我有一个Dictionary<string, object> 作为MongoDB.Save() 的插入输入。
当我用原始类型填充此字典时 - 序列化过程工作正常,但当我尝试插入填充了一些自定义类(例如 - Person 类)的字典时,我收到下一个错误:
.NET type 'Person' cannot be mapped to a BsonValue
我注意到,如果我插入转换为 BsonDocument 的自定义类型,序列化过程会很好。
如何定义 MongoDB 以将特定类序列化为 BsonDocument?
更新:提供真实代码
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; }
}
以下是将数据保存到 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
}
}
这是来自我的 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 );
我希望我的应用程序自动将SensorData 对象序列化为BsonDocument。如果我不手动执行此操作,则会出现以下异常:.NET type 'SensorData' cannot be mapped to a BsonValue
我该怎么做?
更新 2:
好的,找到了问题,在我的“保存到数据库”方法中,我使用了下一个代码来转换我的字典BsonDocument:
var bsonObj = new BsonDocument(RawSensorMessageDictionary);
我希望从其他对象创建一个新的“BsonDocument”实例将像object.ToBsonDocument() 一样处理转换,但显然不是。
最后我把上面的代码换成了下面的:
var bsonObj = RawSensorMessageDictionary.ToBsonDocument();
dal.SaveRawSensorData(dic );
现在可以了。
【问题讨论】:
标签: c# mongodb serialization bson