When reading GNU Classpath a serialized BigInteger with Sun's
VM/rt.jar, I was getting a StreamCorruptedException: signum-magnitude
mismatch.
Comparing serialized blobs I've found that for ZERO-valued
BigIntegers, Sun expect that magnitude comes out as a zero-element
byte array.
Below is a patch for those who care to fix it. I just don't have the
time to go over all the bureaucracy you've put to accept patches, so
I'm just publicly documenting the fix I've applied for my uses
Regards,
--
Rafael "Monoman" Teixeira
---------------------------------------
As I'm currently working a lot with Java and even fixing Java VMs
(JamVM/Kaffe) and GNU Classpath code, I think I may partly borrow the
title (Javaman) from my friend Bruno Souza and become the
MonoNJavaMan. Yeah, I may currently be crazier than usual...
Patch
--- classpath/java/math/BigInteger.java 2005-09-21 14:00:33.000000000 -0300
+++ classpath-nexus/java/math/BigInteger.java 2006-02-16
11:50:27.000000000 -0200
@@ -356,9 +356,9 @@
public int signum()
{
+ if (ival == 0 && words == null)
+ return 0;
int top = words == null ? ival : words[ival-1];
- if (top == 0 && words == null)
- return 0;
return top < 0 ? -1 : 1;
}
@@ -2227,17 +2227,22 @@
throws IOException, ClassNotFoundException
{
s.defaultReadObject();
- words = byteArrayToIntArray(magnitude, signum < 0 ? -1 : 0);
- BigInteger result = make(words, words.length);
- this.ival = result.ival;
- this.words = result.words;
+ if (magnitude.length == 0 || signum == 0) {
+ this.ival = 0;
+ this.words = null;
+ } else {
+ words = byteArrayToIntArray(magnitude, signum < 0 ? -1 : 0);
+ BigInteger result = make(words, words.length);
+ this.ival = result.ival;
+ this.words = result.words;
+ }
}
private void writeObject(ObjectOutputStream s)
throws IOException, ClassNotFoundException
{
signum = signum();
- magnitude = toByteArray();
+ magnitude = (signum == 0) ? new byte[0] : toByteArray();
s.defaultWriteObject();
}
}