Магическое значение файла класса изменяется во время чтения/записи

Я пытаюсь сохранить классы Java в базе данных. Для этого я читаю файлы следующим образом:

bytes = com.google.common.io.ByteStreamsByteStreams.toByteArray(url.openStream());

Затем эти байты кодируются в base64:

org.apache.hadoop.hbase.util.Base64.encodeBytes(bytes);

При их повторной загрузке происходит то же самое наоборот:

org.apache.hadoop.hbase.util.Base64.decode(base64);

и записывается в файл:

com.google.common.io.Files.write(binary, file);

Однако исходный и целевой файлы не идентичны. Использование программы просмотра двоичных файлов показывает, что они действительно очень похожи; только одну вещь, которую я заметил: новый файл начинается с

EF BF BD EF BF BD EF BF BD EF BF BD

вместо ожидаемого

CA FE BA BE

После этого они идентичны, по крайней мере, для нескольких сотен байтов.

Как логическое следствие, я получаю следующее сообщение об ошибке при попытке загрузить класс из нового файла:

java.lang.ClassFormatError: Incompatible magic value 4022320623 in class file ch/unibe/scg/doodle/producerTest/GiantTurtle

Я понятия не имею, где он ломается, и его довольно сложно отлаживать. Мои модульные тесты для чтения/записи файлов зеленые. Где может быть проблема?


person Cedric Reichenbach    schedule 08.04.2014    source источник
comment
Ну, теперь вы найдете место, где это идет не так. Это называется отладкой, и этим занимаются программисты перед публикацией в stackoverflow. Примечание: отладка не требует использования настоящего отладчика, хотя это может помочь. Вы определили несколько мест, где вы преобразовываете данные, и, возможно, они искажаются.   -  person Kayaman    schedule 08.04.2014
comment
Обратите внимание, что байты EF BF BD представляют собой кодировку UTF-8 для U+FFFD, которая является символом замены.   -  person Seelenvirtuose    schedule 08.04.2014
comment
@Kayaman Вы действительно думаете, что я бы разместил здесь сообщение без предшествующих часов отладки? Во-первых, эту проблему трудно отладить, поскольку данные существуют в самых разных формах, что затрудняет сравнение в разных состояниях. Но я уже уверял, что данные не меняются во время выполнения программы.   -  person Cedric Reichenbach    schedule 08.04.2014
comment
@Seelenvirtuose Хороший звонок, я этого не заметил. Но все же это странно, так как я работаю только с байтами...   -  person Cedric Reichenbach    schedule 08.04.2014
comment
Не совсем. Base64 — это текстовые данные. Как выглядят данные до того, как вы их декодируете в Base64? Вероятно, он уже поврежден в базе данных.   -  person Kayaman    schedule 08.04.2014
comment
Хорошо, решил. Из-за специальной настройки, необходимой для плагинов Eclipse в зависимости от проектов, отличных от eclipse, я забыл один шаг, поэтому мой код не обновлялся. Спасибо за вашу помощь.   -  person Cedric Reichenbach    schedule 08.04.2014


Ответы (1)


Я только что узнал, что уже решил проблему в коде, но еще не обновил двоичные файлы: это проект плагина eclipse, зависящий от другого проекта для разработки, но другой проект всегда нужно собирать в банку и копировать в каталог плагина для работы во время выполнения.

Проблема заключалась в том, что я сначала использовал FileWriter на основе String:

FileWriter fstream = new FileWriter(file, append);
BufferedWriter out = new BufferedWriter(fstream);
out.write(content);
out.close();

Повторная упаковка моего проекта и фактическое использование приведенного выше кода решили проблему.

person Cedric Reichenbach    schedule 08.04.2014