Reputation: 4057
I'm trying to implement generic XML serializer as described here: http://blogs.msdn.com/b/field_notes/archive/2008/06/19/the-last-datacontract-serializer-on-earth.aspx
internal static class GenericXmlSerializer<T>
{
public static void WriteObject(T outputObject, string outputFile)
{
using (FileStream writer = new FileStream(outputFile, FileMode.Create))
{
XmlSerializer ser = new XmlSerializer(typeof(T));
ser.Serialize(writer, outputObject);
}
}
public static T ReadObject(string objectData)
{
T deserializedObject = default(T);
using (StringReader reader = new StringReader(objectData))
{
XmlTextReader xmlReader = new XmlTextReader(reader);
XmlSerializer ser = new XmlSerializer(typeof(T));
deserializedObject = (T)ser.Deserialize(xmlReader);
xmlReader.Close();
}
return deserializedObject;
}
}
I then want to call it, but I don't want to hardcode my object types (example hardcoded):
GenericXmlSerializer<MyObjectType>.WriteObject((MyObjectType)data.Payload ,stream);
How do I get those object types at runtime? e.g. something like:
GenericXmlSerializer<typeof(data.Payload)>.WriteObject((MyObjectType)data.Payload ,stream);
Upvotes: 2
Views: 775
Reputation: 823
a generic XML Serializer i wrote vb.net
Imports System.IO
Imports System.Text
Imports System.Xml
Imports System.Xml.Serialization
Friend Module XML
Public Function Deserialize(Of T)(ByVal filename As String) As T
Dim result As T
Using reader As New StreamReader(filename, True)
Dim serializer As New XmlSerializer(GetType(T))
result = CType(serializer.Deserialize(XmlReader.Create(reader)), T)
End Using
Return result
End Function
Public Sub Serialize(Of T)(ByVal filename As String, ByVal obj As T, ByVal qualifiedNames As XmlQualifiedName(), ByVal encoding As Encoding)
Dim namespaces As New XmlSerializerNamespaces(qualifiedNames)
Dim settings = New System.Xml.XmlWriterSettings()
settings.Encoding = encoding
Dim serializer = New XmlSerializer(GetType(T))
Using writer = XmlWriter.Create(filename, settings)
writer.WriteStartDocument(True)
serializer.Serialize(writer, obj, namespaces)
End Using
End Sub
End Module
Upvotes: 0
Reputation: 15364
Remove T
from class, Then you can use as
GenericXmlSerializer.WriteObject(anyObject,"a.xml");
internal static class GenericXmlSerializer
{
public static void WriteObject<T>(T outputObject, string outputFile)
{
using (FileStream writer = new FileStream(outputFile, FileMode.Create))
{
XmlSerializer ser = new XmlSerializer(typeof(T));
ser.Serialize(writer, outputObject);
}
}
public static T ReadObject<T>(string objectData)
{
T deserializedObject = default(T);
using (StringReader reader = new StringReader(objectData))
{
XmlTextReader xmlReader = new XmlTextReader(reader);
XmlSerializer ser = new XmlSerializer(typeof(T));
deserializedObject = (T)ser.Deserialize(xmlReader);
xmlReader.Close();
}
return deserializedObject;
}
}
Upvotes: 2