8 Stimmen

C# - Wie zu xml deserialize Objekt selbst?

public class Options
    {
        public FolderOption FolderOption { set; get; }

        public Options()
        {
            FolderOption = new FolderOption();
        }

        public void Save()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Options));
            TextWriter textWriter = new StreamWriter(@"C:\Options.xml");
            serializer.Serialize(textWriter, this);
            textWriter.Close();
        }

        public void Read()
        {
            XmlSerializer deserializer = new XmlSerializer(typeof(Options));
            TextReader textReader = new StreamReader(@"C:\Options.xml");
            //this = (Options)deserializer.Deserialize(textReader);
            textReader.Close();

        }
    }
}

Ich habe es geschafft, ohne Problem zu speichern, alle Mitglieder von FolderOption sind deserialisiert. Aber das Problem ist, wie man es zurücklesen? Die Zeile - //this = (Optionen)deserializer.Deserialize(textReader); wird nicht funktionieren.

Edit: Gibt es eine Lösung für dieses Problem? Können wir den gleichen Zweck ohne Zuweisung zu diesem erreichen? Das ist deserialize Options Objekt zurück in Option. Ich bin zu faul, um es Eigenschaft für Eigenschaft zu tun. Die Ausführung auf der höchsten Ebene würde eine Menge Aufwand sparen.

1voto

wheelibin Punkte 601

Ich habe mich für diesen Ansatz entschieden (in vb)

    Public Class SerialisableClass

    Public Sub SaveToXML(ByVal outputFilename As String)

        Dim xmls = New System.Xml.Serialization.XmlSerializer(Me.GetType)
        Using sw = New IO.StreamWriter(outputFilename)
            xmls.Serialize(sw, Me)
        End Using

    End Sub

    Private tempState As Object = Me
    Public Sub ReadFromXML(ByVal inputFilename As String)

        Dim xmls = New System.Xml.Serialization.XmlSerializer(Me.GetType)

        Using sr As New IO.StreamReader(inputFilename)
            tempState = xmls.Deserialize(sr)
        End Using

        For Each pi In tempState.GetType.GetProperties()

            Dim name = pi.Name

            Dim realProp = (From p In Me.GetType.GetProperties
                            Where p.Name = name And p.MemberType = Reflection.MemberTypes.Property).Take(1)(0)

            realProp.SetValue(Me, pi.GetValue(tempState, Nothing), Nothing)

        Next

    End Sub

End Class

Ich kann dann einfach etwas wie dieses verwenden:

Public Class ClientSettings

    Inherits SerialisableClass

    Public Property ZipExePath As String
    Public Property DownloadPath As String
    Public Property UpdateInstallPath As String

End Class

und nennen Sie es so:

Dim cs As New ClientSettings
cs.ReadFromXML("c:\myXMLfile.xml")

oder noch besser (wenn ich den notwendigen Konstruktor hinzufüge):

Dim cs as New ClientSettings("c:\myXMLFile.xml")

Es scheint mir schön und sauber zu sein und funktioniert in meiner Situation gut.

Prost

0voto

Eugene Yokota Punkte 92703

Ver XmlSerializer.Deserialize Methode : Sie könnten eine statische Methode wie die folgende erstellen:

    public static Options DeserializeFromFile(string filename) {    
       // Create an instance of the XmlSerializer specifying type and namespace.
       XmlSerializer serializer = new XmlSerializer(typeof(Options));

       // A FileStream is needed to read the XML document.
       using (FileStream fs = new FileStream(filename, FileMode.Open)) {
           XmlReader reader = new XmlTextReader(fs);
           return (Options) serializer.Deserialize(reader);
       } // using
    }

Die obigen Angaben können wie folgt aufgerufen werden:

 Options foo = Options.DeserializeFromFile(@"C:\Options.xml");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X