2016-05-02 9 views
1

Ich versuchte XML-Serialisierung das erste Mal. Der folgende Code funktioniert wie erwartet, aber ich möchte diese "copyFrom" -Methode nicht verwenden.XML-Deserialisierung in Klasse

Gibt es einen besseren Weg, die Speicher- und Lade-Methoden in der Klasse selbst zu halten?

namespace Test 
{ 
    [Serializable] 
    public class Settings 
    { 
     public struct Connection 
     { 
      [XmlAttribute ("user")] 
      public string sUser; 

      [XmlAttribute ("domain")] 
      public string sDomain; 
     } 

     public Connection connection; 

     public Settings() 
     { 
      connection.sUser = ""; 
      connection.sDomain = ""; 
     } 

     internal void loadFromFile() 
     { 
      if (File.Exists (Constants.STORAGE_SETTINGS_FILE)) 
      { 
       using (FileStream filestream = new FileStream (Constants.STORAGE_SETTINGS_FILE, FileMode.Open, FileAccess.Read, FileShare.Read)) 
       { 
        copyFrom ((Settings)new XmlSerializer (typeof (Settings)).Deserialize (filestream)); 
       } 
      } 
     } 

     internal void saveToFile() 
     { 
      using (StreamWriter streamwriter = new StreamWriter (Constants.STORAGE_SETTINGS_FILE)) 
      { 
       new XmlSerializer (typeof (Settings)).Serialize (streamwriter, this); 
      } 
     } 

     internal void copyFrom (Settings settings) 
     { 
      connection.sUser = settings.connection.sUser; 
      connection.sDomain = settings.connection.sDomain; 
     } 
    } 
} 
+1

Ich verstehe nicht, was du meinst. Sie gehören zu der Klasse oder meinst du eine andere Klasse? –

+0

Ich möchte die "copyFrom" vermeiden und die geladenen Werte direkt den Membervariablen zuweisen. –

+0

Das serialize-Ergebnis gibt eine Klasse zurück und Sie benötigen entweder Code, um Eigenschaften in this.sUser und this.sDomain zu verschieben oder diese Variablen statisch zu machen. – jdweng

Antwort

0

Sie können copyFrom Methode entfernen.

Im loadFromFile Methode können Sie

connection = ((Settings)new XmlSerializer(typeof(Settings)).Deserialize(filestream)).connection; 


auch schreiben beachten Sie, dass die Serializable nicht für XML-Serialisierung benötigt Attribut. Entfernen Sie es.

+0

Dies funktioniert für die "Verbindungs" -Struktur, aber gibt es auch eine Möglichkeit, die für das gesamte serialisierte Objekt funktioniert? Ich suche nach etwas wie "this = (Einstellungen) new XmlSerializer (typeof (Einstellungen)). Deserialize (filestream)". Dies funktioniert nicht, weil "this" schreibgeschützt ist. Ich möchte die serialisierten Mitglieder (die beiden Strings für den Moment, aber es wird bald mehr geben) nicht noch einmal auflisten. –

+0

@ André - Ändern Sie das Design Ihrer App. Das Objekt darf sich nicht speichern/laden. Tun Sie es auf einer höheren Ebene. –