近期由于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异常解决方法的更多相关文章

  1. win10系统桌面快捷键图标异常解决方法

    win10系统桌面快捷键图标异常解决方法 前言: 有一次我的一个图标变成白色,找到:https://jingyan.baidu.com/article/948f5924148e67d80ef5f947 ...

  2. SVN Attempted to lock an already-locked dir异常解决方法

    Attempted to lock an already-locked dir异常解决方法 eclipse或myeclipse用svn提交的时候报错: Attempted to lock an alr ...

  3. 安装visual studio2017后 首次启动出现ActivityLog.xml异常解决方法

    安装visual studio2017后 首次启动出现ActivityLog.xml异常解决方法 ps:操作系统是win10 在官网下载了vs2017社区版按照教程(教程链接在文末)安装完成之后,首次 ...

  4. Android 异常解决方法【汇总】

    (1)异常:Android中引入第三方Jar包的方法(Java.lang.NoClassDefFoundError解决办法) 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方 ...

  5. Tomcat部署java项目java.lang.OutOfMemoryError异常解决方法

    java.lang.OutOfMemoryError异常解决方法 Window系统环境下,在catalina.bat文件第一行添加以下内容 set JAVA_OPTS=-Xms512m -Xmx512 ...

  6. springboot springmvc 抛出全局异常解决方法

    springboot中抛出异常,springboot自带的是springmvc框架,这个就不多说了. springmvc统一异常解决方法这里要说明的是.只是结合了springboot的使用而已.直接上 ...

  7. 因修改/etc/ssh权限导致的ssh不能连接异常解决方法

    因修改/etc/ssh权限导致的ssh不能连接异常解决方法 现象: $ssh XXX@192.168.5.21 出现以下问题 Read from socket failed: Connection r ...

  8. .NET MVC Json()处理大数据异常解决方法

    [1-部分原文]: .NET MVC Json()处理大数据异常解决方法 整个项目采用微软的ASP.NET MVC3进行开发,前端显示采用EasyUI框架,图表的显示用的是Highcharts,主要进 ...

  9. Spring10种常见异常解决方法

    在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 ...

随机推荐

  1. (分享)多功能 PDF转换器v3.0版本

    转换的效果非常不错,值得使用.破解成功的截图:这个程序必须随便输入注册码注册,不然会有水印的. 这是程序主界面了 正在测试pdf转word过程,转换结果个人感觉非常不错,跟原版pdf的格式非常接近,个 ...

  2. MySQL 第十天(视图、存储过程、函数、触发器)

    MySql高级-视图.函数.存储过程.触发器 目录 一.视图    1 1.视图的定义    1 2.视图的作用    1 (1)可以简化查询.    1 (2)可以进行权限控制,    3 3.查询 ...

  3. Maven 笔记

    maven DOS 打包命令:maven项目 cd 进入项目根目录执行 mav clean package;

  4. 转:MyBean的安装

    1.下载MyBean源码包.可以到https://git.oschina.net/ymofen/delphi-framework-MyBean下载Zip压缩包,也可以用Git客户端下载. 2.将框架源 ...

  5. IP地址划分

    对于32位的IPV4地址来说,有5中IP地址类型 A类IP地址第一个字节是网络地址,后三个字节是主机地址,且最高位以0开头. 0000001  00000000   00000000 00000001 ...

  6. C语言中如何产生随机数

    今天看到一段小程序 ,里面用到随机数.才发现在C语言中产生随机数不像matlab中那么简单. C中也有rand()函数,但是rand()函数产生的数不是真正意义上的随机数,是一个伪随机数,是根据一个数 ...

  7. An exception occurred while acquiring a poolable resource. Will retry.

    我的是mysql-connector-java-5.1.20.jar加到lib下面就行了.或者在pom中加入配置也行.

  8. 通过innobackupex实现对MySQL的完整备份与还原

    备份 新建一个用于存放备份的目录 mkdir /backup 执行以下命令: innobackupex --password=test /backup/ 执行完后你会看到“completed OK!” ...

  9. 在html中关于如果function的函数名和input的name一样会发生怎样的现象

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="2_PageMethods. ...

  10. SQL Server 临时表的删除

    --临时表与一般的表不同,它是保存到tempDb表中.临时表的表名与你所建的表名也不一样,因为他要为不同人的相同操作创建不同的临时表. --1.错误的删除操作: --错误的临时表删除操作,因为所在数据 ...