С# base64 кодирование/декодирование с сериализацией объектов

Я использую сериализацию и десериализацию в С# для моего проекта (который является классом). Они сериализуются и сохраняются в файле XML. При загрузке проекта все идет хорошо.

Теперь я пытаюсь закодировать сериализованный проект на Base64, а затем сохранить файл, что тоже хорошо. Первая строка файла (до кодирования!) Выглядит так:

<?xml version="1.0" encoding="utf-8"?>
  <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Когда я декодирую файл, там есть? добавлено перед строкой:

?<?xml version="1.0" encoding="utf-8"?>
  <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Код, который я использую для кодирования:

byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
        string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
        return returnValue;

И код для декодирования:

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
        string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
        return returnValue;

Что это может быть и как я могу это исправить?

Ответ 1

Файл объявляет себя как UTF-8 - так почему вы используете ASCII для его кодирования в двоичном формате? В UTF-8 много символов, которые не могут быть представлены в ASCII. Вам даже нужно иметь файл в текстовой форме в памяти для начала? Почему бы просто не загружать его как двоичные данные для начала (например, File.ReadAllBytes)?

Если вам нужно начать со строки, используйте Encoding.UTF-8 (или Encoding.Unicode, хотя это, вероятно, приведет к большему массиву байтов), и все должно быть хорошо. Этот дополнительный символ - это знак байтового байта, который не может быть представлен в ASCII, следовательно, "?" символ замены.

Ответ 2

Угадай? представляет собой байтовый указатель-маркер, который является символом, который не может быть представлен в ASCII. Почему вы не используете кодировку UTF-8?

byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);

Ответ 3

Вместо того, чтобы беспокоиться о кодировании, возможно, просто используйте XmlWriter.Create(outPath) и передайте это XmlWriter вашему коду сериализации. Это позволит избежать этой проблемы и другие проблемы (например, необходимость буферизации очень больших строк для больших графов объектов). Существует перегрузка, которая принимает XmlWriterSettings для более тонкого управления.

XmlWriter принимается большинством xml-кода.