標籤:des style blog http color os io 使用 ar
近期由於DB4O的一些無解的BUG,導致現行的專案查詢效率底下,於是憤而遷移到了MongoDB。
MongoDB雖然比DB4O的使用者要多一些,但是文檔依然極度匱乏,遇到問題不是那麼容易就能搜到解決辦法,在此分享一個遇到的比較要命的異常問題的修正辦法。
異常情況描述
我的項目使用的是C#版官方驅動,運轉一直良好,今天在訪問期間突然就出現了這樣的異常,並且無論怎麼重新整理都無法恢複:
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) +342
[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) +247
任何讀取到使用者資料的頁面都會報這個錯誤,完全無法正常使用網站了。
原因分析
注意錯誤提示中我標註的紅色內容位置,問題就可以定位到User類的Money屬性上:
public float Money { get; set; }
這屬性很簡單,就是個float類型的數字而已,怎麼會出錯呢?
用MongoVUE查看資料庫的User集合,完全正常,只是這個Money值由於是浮點數,會有一定的誤差,導致小數位元非常長。
直接搜尋"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這種浮點型資料都應該顯式進行此聲明,否則就會留下嚴重隱患。
MongoDB的TruncationException異常解決方案