Domanda

sto usando la serializzazione e deserializzazione in C # per il mio progetto (che è una classe). Sono serializzato e salvato in un file XML. Quando si carica il progetto, tutto va bene.

Ora sto cercando di codificare il progetto serializzato a Base64 e quindi salvare il file, che va bene anche. La prima riga del file (! Prima codificato) si presenta così:

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

Quando ho decodificare il file, c'è un aggiunto davanti alla riga:?

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

Il codice che uso per codificare:

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

E il codice per la decodifica:

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

Che cosa può essere questo e come posso risolvere questo problema?

È stato utile?

Soluzione

Il file si dichiara come UTF-8 - e allora perché stai usando ASCII per codificare in binario? Ci sono molti personaggi in UTF-8, che non possono essere rappresentati in ASCII. Non si hanno nemmeno bisogno di avere il file in formato testo in-memory per iniziare? Perché non basta caricarlo come dati binari per iniziare con (ad esempio File.ReadAllBytes)?

Se non ha bisogno di iniziare con una stringa, utilizzare Encoding.UTF-8 (o Encoding.Unicode, anche se questo probabilmente porterà ad un array di byte più grande) e tutto dovrebbe andare bene. Quel personaggio extra è un segno di ordine di byte - che non può essere rappresentato in ASCII, da qui il "?" carattere di rimpiazzo.

Altri suggerimenti

A occhio e croce? rappresenta il Byte-Order-Marker, che è un personaggio che non può essere rappresentato in ASCII. Perché non utilizza la codifica UTF-8?

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

Invece di doversi preoccupare di codifica, forse basta usare XmlWriter.Create(outPath), e passare che XmlWriter al tuo codice di serializzazione. Che evitare questo problema, e altre questioni (come quello di avere al buffer molto grandi stringhe per grandi oggetti grafici). C'è un sovraccarico che accetta un XmlWriterSettings per un controllo più fine.

XmlWriter è accettato dalla maggior parte del codice XML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top