С# 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-кода.