2016-04-01 6 views
1

Wenn Sie System.Configuration.ConfigurationElement erweitern und das DeserializeElement überschreiben arbeitet eveything wie erwartet und kann bekommen, was ich von ihm benötige den XmlReader, der immer zur Verfügung gestellt und funktionsfähig ist.XmlWriter an ConfigurationElement.SerializeElement übergeben ist immer Null auf Configuration.Save

Leider, wenn ich das SerializeElement überschreibe, ist der XmlWriter, der ihm zur Verfügung gestellt wird, immer Null, aus irgendeinem Grund muss ich noch herausfinden, warum. Ich habe versucht, andere Methoden zu überschreiben und das Base.SerializeElement als erste Sache im Anruf anzurufen. Unabhängig davon muss ich noch einen Weg finden, um sicherzustellen, dass der XmlWriter an SerializeElement übergeben wird, wenn die Configuration.Save-Methode aufgerufen wird, ist nicht null.

Antwort

1

Ich habe etwas mehr gegraben, indem ich auf die Quelle für das System.Configuration.ConfigurationElement schaute, um zu sehen, was es tut, wenn es SerializeElement aufruft. Scheinbar SerializeToXmlElement ist der primäre Aufrufer und es hat den folgenden Codeblock.

if (SerializeElement(null, false) == true) // check if there is anything to write... 
{ 
    if (writer != null) 
     writer.WriteStartElement(elementName); 
    DataToWrite |= SerializeElement(writer, false); 
    if (writer != null) 
     writer.WriteEndElement(); 
} 

Wie Sie es zuerst null geht sehen, um zu sehen, ob es etwas serialisieren muss und wenn es wahr kehrt dann übergibt er den eigentlichen Schriftsteller.

Dies ist in den MSDN-Dokumenten nicht dokumentiert. Meine Lösung, um dies zu beheben, besteht darin, die geänderten Methoden mit der Verfolgung von Änderungen zu überschreiben und diese dann an den Anfang meines SerializeElement hinzuzufügen.

if (writer == null) 
    return isModified; 

Also ich bin nicht sicher, warum es nicht seine eigene IsModified Methode nicht verwendet zu wissen, ob es serialisiert werden oder nicht braucht, da dies eine sehr seltsame Art und Weise, es zu tun. Diese Lösung funktioniert jedoch.