MongoDB的TruncationException異常解決方案

來源:互聯網
上載者:User

標籤: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異常解決方案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.