В вашем случае это был Maven, который возился с вашими файлами, однако я нашел то же самое по другой причине и поэтому документирую это здесь, поскольку это единственный полезный результат поиска в Google.
Я сохранял сериализованные объекты в виде наборов данных для модульных тестов и сохранял их в системе контроля версий. Было ли это хорошей идеей или нет, это вопрос для обсуждения, но в другой раз.
Файлы начинаются с:
AC ED 00 05 ...
После хранения в Git они становятся:
EF BF BD EF BF BD 00 05 ...
Это вызывает ошибку:
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:782)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
Git изменяет не только эти начальные байты, но и множество байтов в файле. Он пытается конвертировать между окончаниями строк в стиле Windows и Unix. Эвристика, используемая для определения того, содержит ли файл текст, не работает.
Решением было добавить файл .gitattributes
, в котором указаны некоторые файлы, исключаемые из этой обработки:
*.bytes -crlf
Я также убедился, что мой .git/config
файл имеет следующее:
[core]
autocrlf = false
С этими изменениями я удалил индекс и принудительно произвел сброс:
rm .git/index
git reset # force rescan of the index
git status # any files listed here will experience changes
git add -u
git commit -m "Line ending normalisation changes."
Надеюсь, это кому-нибудь поможет. Я не гуру Git, так что, возможно, некоторые из этих шагов не нужны, но они сработали для меня.