DermFrench
DermFrench

Reputation: 4057

Generic XML Serializer

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

Answers (2)

Felix Quehl
Felix Quehl

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

EZI
EZI

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

Related Questions