codifica base64 # C / decodifica con serializzazione di rilascio oggetti
-
21-09-2019 - |
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?
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.