C# base64 d'encodage/de décodage de la sérialisation des objets en question
Je suis en utilisant la sérialisation et la désérialisation en C# pour mon Projet (qui est une Classe).
Ils sont sérialisés et enregistré dans un fichier XML. Lors du chargement du Projet, tout va bien.
Maintenant, je suis en train de coder le sérialisé Projet en Base64 et puis enregistrez le fichier qui va bien aussi. La première ligne du fichier (avant codé!) ressemble à ceci:
<?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">
Quand je décoder le fichier, il y a un ? ajouté à l'avant de la ligne:
?<?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">
Le code que j'utilise pour encoder:
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
Et le code de décodage:
byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
return returnValue;
Ce que cela peut être et comment je peux résoudre ce problème?
OriginalL'auteur MysticEarth | 2009-12-24
Vous devez vous connecter pour publier un commentaire.
Le fichier déclare lui-même en tant que UTF-8 - alors, pourquoi êtes-vous en utilisant l'ASCII pour le coder en binaire? Il y a beaucoup de caractères en UTF-8 ce qui ne peut pas être représenté en ASCII. Avez-vous encore avoir le fichier sous forme de texte en mémoire pour commencer? Pourquoi ne pas charger comme des données binaires (par exemple
File.ReadAllBytes
)?Si vous ne besoin de commencer avec une chaîne, utilisez
Encoding.UTF-8
(ouEncoding.Unicode
, bien que ce ne sera probablement entraîner un plus grand tableau d'octets) et tout devrait bien se passer. Que de caractère supplémentaire est une marque d'ordre d'octet - qui ne peut pas être représenté en ASCII, d'où le "?" caractère de remplacement.OriginalL'auteur Jon Skeet
À une supposition ? représente l'Octet de Commande de Marqueur qui est un caractère qui ne peut pas être représenté en ASCII. Pourquoi n'êtes-vous pas en utilisant le codage UTF-8?
OriginalL'auteur AnthonyWJones
Plutôt que d'avoir à vous soucier de codage, peut-être juste utiliser
XmlWriter.Create(outPath)
et passerXmlWriter
à votre code de sérialisation. Qui permettra d'éviter ce problème et d'autres questions (comme le devoir de mémoire tampon de très grandes chaînes de grands graphes d'objets). Il ya une surcharge qui accepte unXmlWriterSettings
pour un contrôle plus précis.XmlWriter
est accepté par la plupart de code xml.OriginalL'auteur Marc Gravell