Sie sind hier: Startseite
 Liste aller Codebeispiele

Deserialisieren aus XML-String

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

Querverweise

 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