C# Sérialisation XML - points d'interrogation de Pointe
Problème
En tirant profit de quelques échantillons que j'ai trouvé en ligne ici, j'ai écrit certains de sérialisation XML méthodes.
- Method1: Sérialiser un Objet et de retour: (a) le type, (b) de la chaîne xml
- Method2: Prend (a) et (b) ci-dessus et permet d'être l'Objet.
J'ai remarqué que la chaîne xml de la Method1 contient l'un des leaders de '?'. Cela semble aller pour le mieux lors de l'utilisation de Method2 de reconstruire l'Objet.
Mais en faisant quelques tests dans l'application, nous sommes parfois conduisant '???' au lieu de cela. De ce fait, les Method2 lancer une exception, tout en essayant de reconstruire l'Objet.
L '"Objet" dans ce cas, c'était juste une simple int.
Système.InvalidOperationException est non gérée
Message="Il y a une erreur dans le document XML (1, 1)."
Source="System.Xml"
StackTrace:
au Système.Xml.La sérialisation.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
au Système.Xml.La sérialisation.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
au Système.Xml.La sérialisation.XmlSerializer.Deserialize(Stream stream)
au XMLSerialization.Programme.DeserializeXmlStringToObject(String xmlString, Chaîne objectType) C:\Documents and Settings\...Projets\XMLSerialization\Programme.cs:ligne 96
au XMLSerialization.Programme.Main(String[] args) dans C:\Documents and Settings\...Projets\XMLSerialization\Programme.cs:ligne 49
Quelqu'un serait-il en mesure de jeter un peu de lumière sur ce qui pourrait être la cause?
Exemple De Code
Voici un exemple de code à partir de la mini-testeur, j'ai écrit tout ce codage, qui s'exécute en tant que VS console application. Il va vous montrer la chaîne XML. Vous pouvez également décommentez les régions d'ajouter le plus grand '??' pour reproduire l'exception.
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace XMLSerialization
{
class Program
{
static void Main(string[] args)
{
//deserialize to string
#region int
object inObj = 5;
#endregion
#region string
//object inObj = "Testing123";
#endregion
#region list
//List inObj = new List();
//inObj.Add("0:25");
//inObj.Add("1:26");
#endregion
string[] stringArray = SerializeObjectToXmlString(inObj);
#region include leading ???
//int indexOfBracket = stringArray[0].IndexOf('<');
//stringArray[0] = "??" + stringArray[0];
#endregion
#region strip out leading ???
//int indexOfBracket = stringArray[0].IndexOf('<');
//string trimmedString = stringArray[0].Substring(indexOfBracket);
//stringArray[0] = trimmedString;
#endregion
Console.WriteLine("Input");
Console.WriteLine("-----");
Console.WriteLine("Object Type: " + stringArray[1]);
Console.WriteLine();
Console.WriteLine("XML String: " + Environment.NewLine + stringArray[0]);
Console.WriteLine(String.Empty);
//serialize back to object
object outObj = DeserializeXmlStringToObject(stringArray[0], stringArray[1]);
Console.WriteLine("Output");
Console.WriteLine("------");
#region int
Console.WriteLine("Object: " + (int)outObj);
#endregion
#region string
//Console.WriteLine("Object: " + (string)outObj);
#endregion
#region list
//string[] tempArray;
//List list = (List)outObj;
//foreach (string pair in list)
//{
// tempArray = pair.Split(':');
// Console.WriteLine(String.Format("Key:{0} Value:{1}", tempArray[0], tempArray[1]));
//}
#endregion
Console.Read();
}
private static string[] SerializeObjectToXmlString(object obj)
{
XmlTextWriter writer = new XmlTextWriter(new MemoryStream(), Encoding.UTF8);
writer.Formatting = Formatting.Indented;
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(writer, obj);
MemoryStream stream = (MemoryStream)writer.BaseStream;
string xmlString = UTF8ByteArrayToString(stream.ToArray());
string objectType = obj.GetType().FullName;
return new string[]{xmlString, objectType};
}
private static object DeserializeXmlStringToObject(string xmlString, string objectType)
{
MemoryStream stream = new MemoryStream(StringToUTF8ByteArray(xmlString));
XmlSerializer serializer = new XmlSerializer(Type.GetType(objectType));
object obj = serializer.Deserialize(stream);
return obj;
}
private static string UTF8ByteArrayToString(Byte[] characters)
{
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetString(characters);
}
private static byte[] StringToUTF8ByteArray(String pXmlString)
{
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetBytes(pXmlString);
}
}
}
Est-il une exception interne?
OriginalL'auteur | 2009-03-18
Vous devez vous connecter pour publier un commentaire.
Quand je suis venu à travers cette avant, il avait souvent à faire avec le codage. Je voudrais essayer de préciser l'encodage lors de la sérialisation de l'objet. Essayez d'utiliser le code suivant. Aussi, est-il une raison précise pour laquelle vous avez besoin de retourner un
string[]
tableau? J'ai changé vos méthodes à utiliser des génériques de sorte que vous n'avez pas à spécifier un type de.Si vous avez toujours des problèmes, essayez d'utiliser
Encoding.ASCII
dans votre code partout où vous voyezEncoding.UTF8
, sauf si vous avez une raison particulière pour l'utilisation de l'utf-8. Je ne suis pas sûr de la cause, mais j'ai vu l'encodage UTF8 cause exacte de ce problème, dans certains cas, lors de la sérialisation.OriginalL'auteur Dan Herbert
C'est la NOMENCLATURE symbole. Vous pouvez soit supprimer
Ou de l'utilisation UTF32 pour sérialiser
Et désérialiser
Si vous êtes en utilisant ce code qu'à l'intérieur .Net applications à l'aide de UTF32 de ne pas créer des problèmes car c'est le codage par défaut pour tout à l'intérieur .Net
Ma seule hypothèse est que les données sérialisées est lu à l'aide de l'encodage qu'il a été créé. À la question de la longueur, cela peut varier en raison de la longueur de la NOMENCLATURE symbole varie entre les différents encodages Unicode. Encore que je suggère à coller avec de l'UTF-32 si vous n'avez pas à communiquer avec d'autres systèmes.
OriginalL'auteur Sergej Andrejev