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);
} 
}
}
Vous pouvez poster votre entrée et la sortie attendue?
Est-il une exception interne?

OriginalL'auteur | 2009-03-18