MongoDB的TruncationException異常解決方法

近期因爲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"無果,展轉找到了一個相似的問題解答:

http://stackoverflow.com/questions/5314238/how-do-i-set-the-serialization-options-for-the-geo-values-using-the-official-10g

按照解答者提供的方法進行嘗試:

[BsonRepresentation(BsonType.Double, AllowTruncation = true)]
        public float Money
        {
            get;
            set;
        }

果真一切正常了,看來主要是要顯式聲明容許驅動程序截斷浮點類型的多餘位數。

 

總結

這真是純坑爹的設計,初期不強制聲明,運行期間須要截斷時才報錯,定時炸彈同樣兇殘。

看來像decimal、float、double這種浮點型數據都應該顯式進行此聲明,不然就會留下嚴重隱患。

相關文章
相關標籤/搜索