最近项目中把业务对象System.Web.Script.Serialization.JavaScriptSerializer 序列成JSOn传到远程服务端后再反序列化Dictionary<string, object>对象,在调用Mongodb.Csharp 方法, var document = new BsonDocument().AddRange(dic2) 出现异常
“ System.ArgumentException: .NET type System.Decimal cannot be mapped to a BsonValue.”
最后发现JavaScriptSerializer 这个类反序列化后把业务对象中的小数的类型转为为“System.Decimal”类型了,Mongodb.CSharp 驱动无法映射到有效的mongodb数据类型,所以异常,.net JavaScriptSerializer反序列化后把业务对象中的小数的类型转为为“System.Decimal”类型,这样是不能跨平台兼容的,不知道这个功能这样设计啥意图,解决办法:
1.ServiceStack.Text.TypeSerializer 序列化,传到远程再反序列化后得到的小数字段类型是“String"类型,这样Mongodb.CSharp就能识别了,正确插入到数据库了,顺便说下微软提供的几种序列化工具,无论速度,还是序列化的大小都是不尽人意,这方面遥遥领先的是google 的PB,ServiceStack.Text紧随其后 性能,平台兼容性都不错。
2.给Decimal字段增加 [BsonRepresentation(BsonType.Double)] 特性(注:这种方式只能解决不通过序列化方式直接调用API写入数据库场景)