2010-04-19 10 views
9

Wenn # unter Verwendung von XML-Serialisierung in C, verwende ich Code wie folgt:Verwendung von Generika mit XmlSerializer

public MyObject LoadData() 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject)); 
    using (TextReader reader = new StreamReader(settingsFileName)) 
    { 
     return (MyObject)xmlSerializer.Deserialize(reader); 
    } 
} 

(und ähnlicher Code für die Deserialisierung).

Es erfordert Gießen und ist nicht wirklich nett. Gibt es eine Möglichkeit direkt in .NET Framework Generics mit Serialisierung zu verwenden? Das heißt so etwas wie zu schreiben:

public MyObject LoadData() 
{ 
    // Generics here. 
    XmlSerializer<MyObject> xmlSerializer = new XmlSerializer(); 
    using (TextReader reader = new StreamReader(settingsFileName)) 
    { 
     // No casts nevermore. 
     return xmlSerializer.Deserialize(reader); 
    } 
} 
+0

Ein generisches 'XmlSerializer' wie oben in Ihrem Beispiel gezeigt existiert nicht. Sie müssen Ihren eigenen Wrapper erstellen, wenn Sie diese Funktionalität wünschen. –

Antwort

17

Eine Ergänzung zu @Oded, können Sie die method Generic als gut machen:

public T ConvertXml<T>(string xml) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    return (T)serializer.Deserialize(new StringReader(xml)); 
} 

Auf diese Weise müssen Sie nicht die gesamte Klasse generisch machen, und Sie können es wie folgt verwenden:

var result = ConvertXml<MyObject>(source); 
+2

Akzeptieren dieser Antwort anstelle von Oded, da diese keine Klasse erfordert, und in der Tat möchte ich die meiste Zeit nicht erstellen (z. B. wenn in einem kleinen Projekt auf alle XML-Daten zugegriffen wird von einer Klasse). Danke an alle für die Beantwortung. –

+0

Warum wurde diese Antwort akzeptiert? Es enthält einen Code-Fehler (Semikolon bei der Verwendung) und XmlSerializer-Klasse ist nicht IDisposable, kann daher nicht in einem Anwendungsbereich verwendet werden, so wird es nicht aus zwei Gründen kompilieren ... – Koen

+1

@Koen, sorry verpasst, danke für die Köpfe oben. Korrigiert es. –

11

Machen Sie Ihre Serialisierung Klasse/Methode generic:

public T LoadData<T>() 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
    using (TextReader reader = new StreamReader(settingsFileName)) 
    { 
     return (T)xmlSerializer.Deserialize(reader); 
    } 
} 
+0

Refactor diesen Code! ;) –

+1

@Filip - Ganz richtig ... Ich habe den generischen Parameter vergessen ... – Oded

+0

Das mache ich in den meisten meiner Projekte. Aber ich habe mich gefragt, warum dies nicht in den letzten Versionen von .NET Framework eingebettet ist. –

2

Eine einfache allgemeine Wrapper: diese

static void Main(string[] args) 
{ 
    Person p = new Person { Name = "HelloWorld" }; 
    GenericSerializer<Person> ser = new GenericSerializer<Person>(); 
    ser.Serialize(new StreamWriter("person.xml"), p); 
} 
0

Versuchen:

public class GenericSerializer<T> : XmlSerializer 
{ 
    public GenericSerializer(): base(typeof(T)) { } 
} 

Dieses Ihr Objekt in dem ist/Debug-Ordner serialisiert werden.

public class SerializeConfig<T> where T : class 
{ 
    public static void Serialize(string path, T type) 
    { 
     var serializer = new XmlSerializer(type.GetType()); 
     using (var writer = new FileStream(path, FileMode.Create)) 
     { 
      serializer.Serialize(writer, type); 
     } 
    } 

    public static T DeSerialize(string path) 
    { 
     T type; 
     var serializer = new XmlSerializer(typeof(T)); 
     using (var reader = XmlReader.Create(path)) 
     { 
      type = serializer.Deserialize(reader) as T; 
     } 
     return type; 
    } 
} 
0

immer Arbeit für mich

public static string ObjectToXmlSerialize<T>(T dataToSerialize) 
    { 
     try 
     { 
      var stringwriter = new System.IO.StringWriter(); 
      var serializer = new XmlSerializer(typeof(T)); 
      serializer.Serialize(stringwriter, dataToSerialize); 
      return stringwriter.ToString(); 
     } 
     catch (Exception ex) 
     { 
     } 
     return null; 
    } 

und dies ist für Deserialize:

public static T XmlDeserializeToObject<T>(string xmlText) 
    { 
     try 
     { 
      var stringReader = new System.IO.StringReader(xmlText); 
      var serializer = new XmlSerializer(typeof(T)); 
      return (T)serializer.Deserialize(stringReader); 
     } 
     catch (Exception ex) 
     { 
     } 
     return default(T); 
    } 
Verwandte Themen