近期因爲DB4O的一些無解的BUG,致使現行的項目查詢效率底下,因而憤而遷移到了MongoDB。數據庫
MongoDB雖然比DB4O的用戶要多一些,可是文檔依然極度匱乏,遇到問題不是那麼容易就能搜到解決辦法,在此分享一個遇到的比較要命的異常問題的修正辦法。網站
個人項目使用的是C#版官方驅動,運轉一直良好,今天在訪問期間忽然就出現了這樣的異常,而且不管怎麼刷新都沒法恢復:spa
MongoDB.Bson.TruncationException: Truncation resulted in data loss.設計
[TruncationException: Truncation resulted in data loss.]
MongoDB.Bson.Serialization.Options.RepresentationSerializationOptions.ToSingle(Double value) +339
MongoDB.Bson.Serialization.Serializers.SingleSerializer.Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options) +257
MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader bsonReader, BsonMemberMap memberMap) +342code[FileFormatException: An error occurred while deserializing the Money property of class MongoModels.User: Truncation resulted in data loss.]
MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader bsonReader, BsonMemberMap memberMap) +878
MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options) +1343
MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options) +247orm
任何讀取到用戶數據的頁面都會報這個錯誤,徹底沒法正常使用網站了。blog
注意錯誤提示中我標註的紅色內容位置,問題就能夠定位到User類的Money屬性上:ci
public float Money { get; set; }
這屬性很簡單,就是個float類型的數字而已,怎麼會出錯呢?文檔
用MongoVUE查看數據庫的User集合,徹底正常,只是這個Money值因爲是浮點數,會有必定的偏差,致使小數位數很是長。get
直接搜索"Truncation resulted in data loss"無果,展轉找到了一個相似的問題解答:
按照解答者提供的方法進行嘗試:
[BsonRepresentation(BsonType.Double, AllowTruncation = true)] public float Money { get; set; }
果真一切正常了,看來主要是要顯式聲明容許驅動程序截斷浮點類型的多餘位數。
這真是純坑爹的設計,初期不強制聲明,運行期間須要截斷時才報錯,定時炸彈同樣兇殘。
看來像decimal、float、double這種浮點型數據都應該顯式進行此聲明,不然就會留下嚴重隱患。