C# XML-Serialisierung - Führende Fragezeichen

Problem

Durch die Nutzung einige Proben, die ich online gefunden hier, die ich geschrieben habe, einige XML-Serialisierung Methoden.

  • Methode1: ein Objekt Serialisieren und Rückgabe: (a) Art, (b) der xml-string
  • Methode2: Nimmt (a) und (b) oben und gibt Sie wieder das Objekt.

Mir ist aufgefallen das die xml-Zeichenfolge aus der Methode1 enthält ein führender '?'. Dieser scheint in Ordnung zu sein, wenn mit Methode2 zu rekonstruieren, das Objekt.

Aber bei einigen Tests in der Anwendung, manchmal haben wir führende '???' statt. Dies verursacht die Methode2 eine exception werfen, während Sie versuchen, zu rekonstruieren, das Objekt.
Das "Objekt" in diesem Fall wurde nur eine einfache int.

System.InvalidOperationException wurde unbehandelt
Message="Es ist ein Fehler in XML Dokument (1, 1)."
Quelle="System.Xml"
StackTrace:
System.Xml.Serialisierung.XmlSerializer.Deserialisieren(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
System.Xml.Serialisierung.XmlSerializer.Deserialisieren(XmlReader xmlReader, String encodingStyle)
System.Xml.Serialisierung.XmlSerializer.Deserialisieren(Stream stream)
bei XMLSerialization.Programm.DeserializeXmlStringToObject(String xmlString, String objectType) in C:\Documents und Einstellungen\...Projekte\XMLSerialization\Program.cs:Zeile 96
bei XMLSerialization.Programm.Main(String[] args) in C:\Documents und Einstellungen\...Projekte\XMLSerialization\Program.cs:Zeile 49

Wäre jeder in der Lage sein, etwas Licht auf, was könnte die Ursache sein?

Beispielcode

Hier der Beispiel-code aus dem mini-tester schrieb ich während der Programmierung dieses bis die läuft wie ein VS-Konsole-app. Es zeigt Ihnen die XML-Zeichenfolge. Sie können auch heben Sie die Auskommentierung der Regionen zu fügen Sie die zusätzlichen führenden '??' zur Reproduktion die Ausnahme.



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);
        } 


    }
}

  • Können Sie veröffentlichen Sie Ihre Eingabe und erwartete Ausgabe?
  • Gibt es da eine Ausnahme?
InformationsquelleAutor | 2009-03-18
Schreibe einen Kommentar