Code-Beispiel
Ein Beispiel zum Einsatz der Klasse System.Xml.Serialization.XmlSerializer aus der .NET-Klassenbibliothek.
Autor: Dr. Holger Schwichtenberg
Beschreibung
Bei der Deserialisierung aus einer Zeichenkette, die ein XML-Dokument enthält, ist ein kleiner unschöner Winkelzug notwendig. Grundsätzlich kann die Methode Deserialize() genauso wenig wie Serialize() direkt einen String verarbeiten. Daher ist ein MemoryStream notwendig. Um diesen zu beschreiben, verwendet man ein StreamWriter-Objekt. Dieses hat die Eigenschaft, dass es sein Werk nur dann zu Ende bringt, wenn es ordnungsgemäß geschlossen wird. Mit dem Schließen des StreamWriter-Objekts mit Close() wird aber gleichzeitig auch der Stream geschlossen, weshalb der Deserialisierer nicht mehr darauf zugreifen kann. Der Inhalt des MemoryStream-Objekts steht aber noch via ToArray() zur Verfügung. Daher muss der Inhalt in ein anderes MemoryStream-Objekt umkopiert werden.
Programmcodebeispiele Visual Basic .NET (VB.NET)
' ### Deserialisieren aus XML-String
Function xmldeserialize_string(ByVal t As Type,
ByVal s As String) As Object
Dim obj As Object
' --- Objekt in Stream kopieren
Dim stream As New MemoryStream()
Dim w As New StreamWriter(stream)
w.BaseStream.Seek(0, SeekOrigin.End)
w.WriteLine(s)
w.Close()
' Stream umkopieren, weil jetzt geschlossen
stream = New MemoryStream(stream.ToArray)
Dim serializer As New XmlSerializer(t)
obj = serializer.Deserialize(stream)
out("Objekt wurde deserialisiert!")
stream.Close()
Return (obj)
End Function
Programmcodebeispiele CSharp (C#)
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using System.Data;
namespace FCLBuch._System_RuntimeSerialization {
// Hilfsfunktionen für Serialisierung
public class SerializationHelper {
public static object XmlDeserializeString(Type t, string s) {
// Deserialisieren aus XML-String
object obj;
// Objekt in Stream kopieren
MemoryStream stream = new MemoryStream();
StreamWriter w = new StreamWriter(stream);
w.BaseStream.Seek(0, SeekOrigin.End);
w.WriteLine(s);
w.Close();
// Stream umkopieren, weil jetzt geschlossen
stream = new MemoryStream(stream.ToArray());
XmlSerializer serializer = new XmlSerializer(t);
obj = serializer.Deserialize(stream);
FclOutput.PrintOut("Objekt wurde deserialisiert!");
stream.Close();
return (obj);
}
}
}
Hinweise
Ausgaben werden in den Beispielen durch Hilfsroutinen wie out() und
PrintOut() erzeugt. Diese sind hier nicht angegeben, da deren Implementierung
von der jeweiligen Umgebung abhängt. Für Konsolenanwendungen können hier z.B.
Console.WriteLine() einsetzen.
Querverweise
Liste aller Codebeispiele
Definition '.NET Framework Class Library'
Verfügbarkeit der Klasse 'System.Xml.Serialization.XmlSerializer'
Übersicht über den FCL-Namensraum 'System.Xml.Serialization'
.NET & Visual Studio Community Portal