4 Stimmen

C# base64 Kodierung/Dekodierung mit Serialisierung von Objekten Problem

Ich bin mit Serialisierung und Deserialisierung in C# für mein Projekt (die eine Klasse ist). Sie werden serialisiert und in einer XML-Datei gespeichert. Beim Laden des Projekts, geht alles gut.

Jetzt versuche ich, das serialisierte Projekt in Base64 zu kodieren und dann die Datei zu speichern, was auch gut funktioniert. Die erste Zeile der Datei (vor der Kodierung!) sieht wie folgt aus:

<?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">

Wenn ich die Datei dekodiere, gibt es eine ? vor der Linie hinzugefügt:

?<?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">

Der Code, den ich zum Verschlüsseln verwende:

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

Und der Code für die Entschlüsselung:

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

Woran kann das liegen und wie kann ich das beheben?

7voto

Jon Skeet Punkte 1325502

Die Datei deklariert sich selbst als UTF-8 - warum verwenden Sie also ASCII, um sie binär zu kodieren? Es gibt viele Zeichen in UTF-8, die in ASCII nicht dargestellt werden können. Müssen Sie die Datei überhaupt in Textform im Speicher haben, um damit zu beginnen? Warum laden Sie sie nicht einfach als Binärdaten (z.B. File.ReadAllBytes )?

Wenn Sie tun mit einer Zeichenkette beginnen müssen, verwenden Sie Encoding.UTF-8 (oder Encoding.Unicode (obwohl dies wahrscheinlich zu einem größeren Byte-Array führen wird) und alles sollte in Ordnung sein. Das zusätzliche Zeichen ist eine Byte-Order-Marke - die nicht in ASCII dargestellt werden kann, daher das "?" Ersatzzeichen.

2voto

AnthonyWJones Punkte 182582

Vermutlich steht ? für den Byte-Order-Marker, ein Zeichen, das nicht in ASCII dargestellt werden kann. Warum verwenden Sie nicht die UTF-8-Kodierung?

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

0voto

Marc Gravell Punkte 970173

Anstatt sich um die Kodierung zu kümmern, können Sie auch einfach XmlWriter.Create(outPath) und geben das XmlWriter zu Ihrem Serialisierungscode. Dadurch werden dieses und andere Probleme vermieden (z. B. das Puffern sehr großer Strings für große Objektgraphen). Es gibt eine Überladung, die eine XmlWriterSettings für eine genauere Kontrolle.

XmlWriter wird von den meisten Xml-Codes akzeptiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X