Из-за точного формата сериализованного файла добавление действительно испортит его. Вы должны записать все объекты в файл как часть одного и того же потока, иначе он будет сбой при чтении метаданных потока, когда он ожидает объект.
Вы можете прочитать спецификацию Serialization Specification для более подробной информации или (проще) прочитать эту нить , где Roedy Green говорит в основном то, что я только что сказал.
Никогда не задумывался об этом, но почему бы не написать инструкции по использованию в stderr, если программа вызывалась без аргументов или с неправильными аргументами, и не записать их в stdout при вызове с аргументом - help
(или подобным)? Таким образом, если использование отображается из-за ошибки, оно переходит на stderr, а если это не ошибка, потому что пользователь запросил это, переходит на stdout. В чем-то это кажется логичным.
По моему мнению, критерий - это то, каким образом появляется информация. Если он требует немедленной реакции или внимания, я помещаю его в stderr (потому что он не буферизован). Если он как-то информативен и не содержит ошибок, то это для stdout.
Я бы использовал STDERR, поскольку простое помещение его в STDOUT может вызвать проблемы с конвейерным выводом, и он появится в журналах для cronjobs, чтобы вы могли легче заметить ошибку .
Это может быть только мнение, но я думаю, что писать в stderr лучше всего делать. Таким образом, сообщение об использовании появляется, если пользователь совершает ошибку, даже если нормальный вывод был перенаправлен.