BigInteger problem
MacX19 opened this issue · 2 comments
Serialization BigInteger with different versions of Java produces different result
byte[] res;
try (PersistStream stream = new PersistStream()) {
stream.writeObject(new BigInteger("123"));
res = stream.toByteArray();
}
System.out.println(res.length + " bytes, hash=" + Arrays.hashCode(res));
Java 8 output:
141 bytes, hash=-1637736666
Java 11 and 17 output:
169 bytes, hash=1514769574
If BigInteger serialized with Java 8 and deserialized with Java 11
try (DeserializeStream des = new DeserializeStream(res)) {
System.out.println(des.readObject());
}
Output:
Jul 15, 2022 4:14:09 PM one.nio.serial.Repository logFieldMismatch
WARNING: [1b5f8d93540f6312] Stream field is missed locally: int java.math.BigInteger.bitCount
Jul 15, 2022 4:14:09 PM one.nio.serial.Repository logFieldMismatch
WARNING: [1b5f8d93540f6312] Stream field is missed locally: int java.math.BigInteger.bitLength
Jul 15, 2022 4:14:09 PM one.nio.serial.Repository logFieldMismatch
WARNING: [1b5f8d93540f6312] Stream field is missed locally: int java.math.BigInteger.lowestSetBit
Jul 15, 2022 4:14:09 PM one.nio.serial.Repository logFieldMismatch
WARNING: [1b5f8d93540f6312] Stream field is missed locally: int java.math.BigInteger.firstNonzeroIntNum
Jul 15, 2022 4:14:09 PM one.nio.serial.Repository logFieldMismatch
WARNING: [1b5f8d93540f6312] Local field is missed in stream: int java.math.BigInteger.bitCountPlusOne
Jul 15, 2022 4:14:09 PM one.nio.serial.Repository logFieldMismatch
WARNING: [1b5f8d93540f6312] Local field is missed in stream: int java.math.BigInteger.bitLengthPlusOne
Jul 15, 2022 4:14:09 PM one.nio.serial.Repository logFieldMismatch
WARNING: [1b5f8d93540f6312] Local field is missed in stream: int java.math.BigInteger.lowestSetBitPlusTwo
Jul 15, 2022 4:14:09 PM one.nio.serial.Repository logFieldMismatch
WARNING: [1b5f8d93540f6312] Local field is missed in stream: int java.math.BigInteger.firstNonzeroIntNumPlusTwo
123
If vice versa
Output:
Jul 15, 2022 4:14:59 PM one.nio.serial.Repository logFieldMismatch
WARNING: [4b1f962d58472cfa] Stream field is missed locally: int java.math.BigInteger.bitCountPlusOne
Jul 15, 2022 4:14:59 PM one.nio.serial.Repository logFieldMismatch
WARNING: [4b1f962d58472cfa] Stream field is missed locally: int java.math.BigInteger.bitLengthPlusOne
Jul 15, 2022 4:14:59 PM one.nio.serial.Repository logFieldMismatch
WARNING: [4b1f962d58472cfa] Stream field is missed locally: int java.math.BigInteger.lowestSetBitPlusTwo
Jul 15, 2022 4:14:59 PM one.nio.serial.Repository logFieldMismatch
WARNING: [4b1f962d58472cfa] Stream field is missed locally: int java.math.BigInteger.firstNonzeroIntNumPlusTwo
Jul 15, 2022 4:14:59 PM one.nio.serial.Repository logFieldMismatch
WARNING: [4b1f962d58472cfa] Local field is missed in stream: int java.math.BigInteger.bitCount
Jul 15, 2022 4:14:59 PM one.nio.serial.Repository logFieldMismatch
WARNING: [4b1f962d58472cfa] Local field is missed in stream: int java.math.BigInteger.bitLength
Jul 15, 2022 4:14:59 PM one.nio.serial.Repository logFieldMismatch
WARNING: [4b1f962d58472cfa] Local field is missed in stream: int java.math.BigInteger.lowestSetBit
Jul 15, 2022 4:14:59 PM one.nio.serial.Repository logFieldMismatch
WARNING: [4b1f962d58472cfa] Local field is missed in stream: int java.math.BigInteger.firstNonzeroIntNum
123
What is exactly the problem you are referring to?
According to your output, all JDK 8, 11 and 17 deserialize the array correctly to 123
.
It's OK that different versions of a class have different serialized representation: that's exactly the goal of one-nio framework - to handle class evolution properly. A message warns about differences in class' fields between serializer and deserializer sides. A similar message is printed whenever you add/remove field of a user class on one side, but do not update the class definition on another. In this case, one-nio just treats BigInteger
similarly as if it were a custom class. The message is printed just once and can be ignored.
Thanks for the answer, I understand. I have disabled the output of warnings to the console.