C # base64 кодирование / декодирование с сериализацией объектов выпуска - PullRequest
4 голосов
/ 24 декабря 2009

Я использую сериализацию и десериализацию в C # для моего проекта (который является классом). Они сериализуются и сохраняются в файл 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;

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

Ответы [ 3 ]

7 голосов
/ 24 декабря 2009

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

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

2 голосов
/ 24 декабря 2009

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

byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);
0 голосов
/ 24 декабря 2009

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

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

...