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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich gekommen bin, über diese vor, ist es in der Regel zu tun hatte, mit Codierung. Ich würde versuchen, unter Angabe der Codierung beim serialisieren Ihr Objekt. Versuchen Sie es mit dem folgenden code. Auch gibt es keine speziellen Grund, warum Sie brauchen, um wieder eine
string[]
array? Ich habe mich verändert, Ihre Methoden zu verwenden, Generika, so dass Sie nicht haben, um einen Typ angeben.Wenn Sie immer noch Probleme haben, versuchen Sie
Encoding.ASCII
im code überall sehen SieEncoding.UTF8
, es sei denn, Sie haben einen besonderen Grund für die Verwendung von UTF8. Ich bin mir nicht sicher, von der Ursache, aber ich habe gesehen, UTF8-Codierung verursachen genau dieses problem in bestimmten Fällen, wenn serialisieren.Dies ist BOM-symbol. Sie können entweder entfernen Sie es
Oder verwenden Sie UTF32 zu serialisieren
Und Deserialisieren
Wenn Sie mit diesem code nur innerhalb .Net-Anwendungen mit UTF32 nicht Probleme schaffen, weil es das Standard-encoding für alles drin .Net