You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ml...@apache.org on 2006/10/18 06:42:14 UTC

svn commit: r465141 - in /incubator/harmony/enhanced/classlib/trunk/modules/math/src: main/java/java/math/BigDecimal.java test/java/tests/api/java/math/BigDecimalTest.java

Author: mloenko
Date: Tue Oct 17 21:42:13 2006
New Revision: 465141

URL: http://svn.apache.org/viewvc?view=rev&rev=465141
Log:
fixed BigDecimal serialization, applied patch from HARMONY-1896
 [classlib][math] Serialization of BigDecimal works incorrtly

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/math/src/main/java/java/math/BigDecimal.java
    incubator/harmony/enhanced/classlib/trunk/modules/math/src/test/java/tests/api/java/math/BigDecimalTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/math/src/main/java/java/math/BigDecimal.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/math/src/main/java/java/math/BigDecimal.java?view=diff&rev=465141&r1=465140&r2=465141
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/math/src/main/java/java/math/BigDecimal.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/math/src/main/java/java/math/BigDecimal.java Tue Oct 17 21:42:13 2006
@@ -19,6 +19,7 @@
 
 import java.io.IOException;
 import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.io.StreamCorruptedException;
 
@@ -1932,16 +1933,30 @@
     }
 
     /** @ar.org.fitc.spec_ref */
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+    private void readObject(ObjectInputStream in) throws IOException,
+            ClassNotFoundException {
         in.defaultReadObject();
-        if (getUnscaledValue() == null) {
-            // math.0B=null unscaled value
-            throw new StreamCorruptedException(Messages.getString("math.0B")); //$NON-NLS-1$
+
+        // see comment to getUnscaledValue()
+//        if (getUnscaledValue() == null) {
+//            // math.0B=null unscaled value
+//            throw new StreamCorruptedException(Messages.getString("math.0B")); //$NON-NLS-1$
+//        }
+
+        this.bitLength = intVal.bitLength();
+        if (this.bitLength < 64) {
+            this.smallValue = intVal.longValue();
         }
-        bitLength = getUnscaledValue().bitLength();
     }
 
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        getUnscaledValue();
+        out.defaultWriteObject();
+    }
+
+
     private BigInteger getUnscaledValue() {
+        // This method is not supposed to return null. Otherwise uncomment 'if' in readObject 
         if(intVal == null) {
             intVal = BigInteger.valueOf(smallValue);
         }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/math/src/test/java/tests/api/java/math/BigDecimalTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/math/src/test/java/tests/api/java/math/BigDecimalTest.java?view=diff&rev=465141&r1=465140&r2=465141
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/math/src/test/java/tests/api/java/math/BigDecimalTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/math/src/test/java/tests/api/java/math/BigDecimalTest.java Tue Oct 17 21:42:13 2006
@@ -17,6 +17,10 @@
 
 package tests.api.java.math;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -868,4 +872,22 @@
 				valueOfJI.toString().equals("0.000"));
 
 	}
+
+	public void test_BigDecimal_serialization() throws Exception {
+        // Regression for HARMONY-1896
+        char[] in = { '1', '5', '6', '7', '8', '7', '.', '0', '0' };
+        BigDecimal bd = new BigDecimal(in, 0, 9);
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(bos);
+        oos.writeObject(bd);
+
+        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+        ObjectInputStream ois = new ObjectInputStream(bis);
+        BigDecimal nbd = (BigDecimal) ois.readObject();
+
+        assertEquals(bd.intValue(), nbd.intValue());
+        assertEquals(bd.doubleValue(), nbd.doubleValue(), 0.0);
+        assertEquals(bd.toString(), nbd.toString());
+    }
 }