Вы берете непрозрачные данные и, по-видимому, пытаетесь записать их в файл в виде текстовых данных, не пропуская их нетекстовые части (в качестве альтернативы вы записываете их как необработанные байты, а затем пытаетесь прочитать их, как будто были основаны на характере, что является почти такой же проблемой).
Это ошибочно с самого начала.
Непрозрачные данные должны рассматриваться как бессмысленные и просто храниться без изменений, чтобы вернуть API, который знает, как с ними обращаться. Если данные должны храниться в текстовой форме, вы должны без потерь преобразовать байты в текст. Подходящими кодировками являются такие вещи, как base64. Кодирование в смысле кодировки набора символов НЕ является без потерь, если вы применяете его к необработанным двоичным данным.
Простое сохранение байтов в файле как байтов (не символов) вместе с префиксом фиксированной длины, указывающим длину сообщения и тему, на которую оно было отправлено, достаточно для воспроизведения сообщений RV через систему .
По отношению к любым текстовым полям внутри сообщения, если кодировка имеет значение (я настоятельно рекомендую избегать этого, вообще говоря, при разработке приложения), тогда у вас возникает та же проблема с воспроизведением, что и при первоначальном времени получения, которое это преобразование из исходной кодировки в желаемую кодировку (возможно, с использованием точно такого же кода), так что это не должно быть проблемой в отношении воспроизведения.