Сериализация BigInteger в Java - PullRequest
0 голосов
/ 05 марта 2012

Я должен записать biginteger в текстовый файл, используя следующую инструкцию.

out.writeObject(n1);

, где мой n1 - это большой целое число длиной 512 бит.

При чтении одного и того же объекта из текстового файла мне присваивается значение, отличное от n1. Может ли кто-нибудь помочь мне с проблемой. Оператор, используемый для чтения значения:

in.readObject();

Заранее спасибо.

1 Ответ

7 голосов
/ 05 марта 2012

Вы забыли опубликовать SSCCE , поэтому вот один для вас:

BigInteger big = new BigInteger("515377520732011331036461129765621272702107522001");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(baos);
outputStream.writeObject(big);
byte[] rawBytes = baos.toByteArray();

ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(rawBytes));
BigInteger bigReadBack = (BigInteger) inputStream.readObject();

assertThat(big).isEqualTo(bigReadBack);

Работает как шарм, сериализует и десериализует 3^100. Можете ли вы попробовать код выше?

ОБНОВЛЕНИЕ: пример с файлом (извините за неописательные имена переменных):

BigInteger big = new BigInteger("515377520732011331036461129765621272702107522001");
OutputStream fos = new FileOutputStream("big.ser");
ObjectOutputStream outputStream = new ObjectOutputStream(fos);
outputStream.writeObject(big);
fos.close();

ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("big.ser"));
BigInteger bigReadBack = (BigInteger) inputStream.readObject();

assertThat(big).isEqualTo(bigReadBack);

Кстати, хранение сериализованных Java-двоичных данных в файле с расширением .txt, как правило, плохая идея ... И не забывайте о кэшировании! (BufferedInputStream / BufferedOutputstream).

...