odnoklassniki/one-nio

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.