`
eighteencold
  • 浏览: 15209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于java的BigDecimal类型经Hessian发布出现Bug的示例

阅读更多
我用的Hessian是Hessian 4.0.7版本
我们用它与spring集成
以下是web.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/classes/*-context.xml</param-value>
	</context-param>
	
	<listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>
    
	<servlet>
		<servlet-name>remoting</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/classes/*-remote.xml</param-value>  
        </init-param> 
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>remoting</servlet-name>
		<url-pattern>/remoting/*</url-pattern>
	</servlet-mapping>

  	<welcome-file-list>
    	<welcome-file>index.jsp</welcome-file>
  	</welcome-file-list>
</web-app>

以下是Hessian发布配置(common-remote.xml):
<?xml version="1.0" encoding="gb2312"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
                 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	<!-- 
		此文件定义上下文内容,各模块需各自按以下指定的文件名在各模块的src文件夹下维护、管理上下文内容。
		此文件只作管理用途,不允许随意修改!
	-->
    <bean name="/remoteLoginService" class="org.springframework.remoting.caucho.HessianServiceExporter"> 
    	<property name="service" ref="fap.loginService"/> 
        <property name="serviceInterface" value="grp.pt.common.ILoginService"/> 
    </bean>
    
    <!-- 用户管理 -->
    <bean name="/remoteUserService" class="org.springframework.remoting.caucho.HessianServiceExporter"> 
    	<property name="service" ref="fap.userService"/> 
        <property name="serviceInterface" value="grp.pt.common.IUserService"/> 
    </bean>  
	
    <bean name="/remoteTest" class="org.springframework.remoting.caucho.HessianServiceExporter"> 
    	<property name="service" ref="testbean"/> 
        <property name="serviceInterface" value="grp.pt.common.ITestService"/> 
    </bean> 
  	    
</beans>


bean的定义我们只关注我们的测试类(common-context.xml):

<bean id="testbean" class="grp.pt.common.bs.TestService"></bean>


接口的定义:
package grp.pt.common;

import java.math.BigDecimal;

public interface ITestService {

	public BigDecimal testBig();
	
	public float testfloat();
	
	public double testdouble();

}


接口实现类的定义:
package grp.pt.common.bs;

import grp.pt.common.ITestService;

import java.math.BigDecimal;

public class TestService implements ITestService {

	public BigDecimal testBig() {
		BigDecimal big=new BigDecimal( "10.90944" );
		System.out.println("服务端:"+big);
		return big;
	}
	public double testdouble(){
		return 10.123d;
	}
	
	public float testfloat(){
		return 10.123f;
	}
}


测试代码:
public static void main(String[] args) throws Exception {
		 String url = "http://localhost:8080/realware/remoting/remoteTest";
		 HessianProxyFactory factory = new HessianProxyFactory();
		 ITestService test = (ITestService) factory.create(ITestService.class,url);
		 BigDecimal bi=test.testBig();
		 System.out.println(test.testdouble());
		 System.out.println(test.testfloat());
		 System.out.println(new BigDecimal(bi.toString()));
		 BigDecimal big=new BigDecimal("10.123");
		 System.out.println(big.toString());
	}


最后服务发布后,测试结果为:
10.123
10.123
0.00000
10.123


服务器打印:
服务端:10.90944

我们可以看到Hessian对于BigDemical类型的序列化后的传输是个大bug,它保留了它的精度,但数值全是0.

分享到:
评论
4 楼 步青龙 2012-05-31  
解决办法:
在 hessian.jar 的 META-INF/hessian 目录下加入 serializers 和 deserializers 这两个文件,  两个文件的内容如下:
serializers
--------------------------
java.math.BigDecimal=com.caucho.hessian.io.StringValueSerializer


deserializers
--------------------------
java.math.BigDecimal=com.caucho.hessian.io.BigDecimalDeserializer
3 楼 eighteencold 2011-08-02  
monkey9047 写道
有没有相应的解决方案呢?

这应该是Hessian的一个bug,用String传值吧
2 楼 monkey9047 2011-08-02  
有没有相应的解决方案呢?
1 楼 xiaoZ5919 2011-07-26  
我也遇到了类似的问题!
问题在BigDecimal类型的应该使用BigDecimalDeserializer,
在basic没有BigDecimal的deserializer,需要使用customer根据类名查找
public Deserializer getCustomDeserializer(Class cl)
Class serClass = Class.forName(cl.getName() + "HessianDeserializer",
                                       false, cl.getClassLoader());

结果类名错误拼错导致找不到相应的反序列化类

相关推荐

    java BigDecimal操作

    在Java编程语言中,BigDecimal类是用于处理高精度、大范围浮点数的工具,它在需要精确计算的场景下非常关键。BigDecimal提供了避免浮点数运算中的精度损失的方法,适用于金融、会计等对精度有严格要求的领域。这篇...

    java中BigDecimal的操作方法

    在Java编程语言中,BigDecimal是用于处理高精度和可配置精度的十进制数的类。在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文...

    将 BigDecimal 类型转换为 Integer 类型.pdf

    BigDecimal 类型是 Java 提供的一种用于精确算术运算的类,它支持任意大小的十进制数,并且能够避免浮点数计算时可能出现的舍入误差。然而,有时我们需要将这些大数转换为整数类型,如 Integer,以便于存储或者进行...

    BigDecimal类

    BigDecimal 类是 Java 中的一种数值类型,主要用于处理超过 16 位有效数字的数值运算。该类提供了多种构造器和方法,用于创建和操作 BigDecimal 对象。 构造器 BigDecimal 类提供了四种构造器,用于创建不同的 ...

    Java SE程序 BigDecimal类

    Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE...

    关于java中BigDecimal的简介(csdn)————程序.pdf

    Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...

    Java Bigdecimal使用原理详解

    Java Bigdecimal使用原理详解 ...Java Bigdecimal使用原理详解主要介绍了Java Bigdecimal的使用原理,包括构造函数、基本类型的转换、加减乘除运算等。通过详细的示例代码,开发者可以更好地理解和使用BigDecimal类。

    BigDecimal工具类.docx

    BigDecimal工具类是Java中用于高精确处理常用数学运算的工具类。该工具类提供了多种精确的数学运算方法,包括加法、减法、乘法和除法等。 在BigDecimal工具类中,我们可以看到多个重载的方法,例如add方法和sub方法...

    java-BigInteger-BigDecimal类源码

    在Java编程语言中,`BigInteger`和`BigDecimal`是两个重要的类,它们分别用于处理大整数和高精度浮点数。这两个类位于`java.math`包下,为开发者提供了超越基本数据类型(如int、long和double)的计算能力。在深入...

    Java中BigDecimal类的使用详解

    Java中BigDecimal类的使用详解 Java中BigDecimal类是Java.math包中提供的一个API类,用于对超过16位有效位的数进行精确的运算。由于浮点数的精度问题,Java中浮点数的计算会失去一定的精确度。因此,使用BigDecimal...

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    在Java编程中,当涉及到需要精确数值计算的场景时,我们通常会使用`BigDecimal`类。这是因为`float`和`double`类型虽然适用于科学计算和工程计算,但它们基于二进制浮点运算,不能保证完全精确的结果。而`BigDecimal...

    Java BigDecimal类用法详解

    Java中的`BigDecimal`类是用来表示任意精度的十进制数,尤其适合于需要精确计算的商业和财务场景。它的核心概念包括非标度值(unscaled value)和标度(scale),非标度值是一个任意精度的整数,标度则是小数点后的...

    flex-hessian-java实例.rar

    Flex-Hessian-Java实例是一个关于使用Flex客户端与Java服务器之间进行高效远程调用的实践案例。这个压缩包包含了实现这一技术所需的关键组件和文件。Flex是Adobe开发的一种开放源码的富互联网应用(RIA)开发框架,...

    Java编程BigDecimal用法实例分享

    Java编程BigDecimal用法实例分享 Java中的BigDecimal类是Java标准库中的一部分,用于处理高精度的数字计算,特别是在商业计算中对数字精度要求较高的场景中。BigDecimal类提供了对大数字的操作,可以精确地计算货币...

    Java BigDecimal和double示例及相关问题解析

    在 Java 中,浮点数的表示形式有多种,包括 float 和 double 等,但是这些类型在进行计算时会出现精度问题,而 BigDecimal 则可以解决这种问题。本文将主要介绍 Java 中的 BigDecimal 和 double 的示例及相关问题...

    string转bigdecimal类型.md

    string转bigdecimal类型

    Java BigDecimal详解_动力节点Java学院整理

    借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供...

    Java BigDecimal使用及基本运算(推荐)

    BigDecimal 类在 Java 中是用于处理高精度和大数值计算的,它确保了在计算过程中不会因为浮点数的精度问题而导致结果错误。由于 double 和 float 类型在处理大数或需要绝对精确计算的场景下存在精度损失,因此 ...

    Java中BigDecimal的基本运算(详解)

    Java中的BigDecimal是一种高精度的数据类型,它可以用来表示非常大的整数和小数,提供了丰富的数学运算功能。下面我们将对Java中BigDecimal的基本运算进行详细的介绍。 构造方法 BigDecimal有四种构造方法,但是...

    BigDecimal开n次方根

    复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数

Global site tag (gtag.js) - Google Analytics