Beim Erstellen von XmlSerializer-Instanzen in .NET werden Assemblys zum Serialisieren und Deserialisieren des angegebenen Typs dynamisch generiert. Dies ist ein zeitaufwendiger Prozess. Mit dem Tool sgen.exe von Microsoft können XmlSerializer-Instanzen vorkompiliert werden, um sie später zu verwenden, ohne sie dynamisch zu generieren. Leider ist dies nicht möglich mit XmlSerializer-Instanzen, die XmlAttributeOverrides verwenden.
Gibt es eine Möglichkeit, diese XmlSerializer-Instanzen vorzukompilieren, um eine Generierung zur Laufzeit zu vermeiden?
Andreas, das ist kein Problem des Sgen-Tools selbst, dies liegt an der XmlSerializer-Implementierung.
Wenn Sie eine Instanz von XmlSerializer unter Verwendung des Konstruktors mit nur einem Type-Argument erstellen, geht es und prüft den Cache und sucht nach den vorgenerierten Assemblys. Aber wenn Sie den Konstruktor mit XmlAttributeOverrides verwenden, überprüft XmlSerializer keine Caches und erstellt die temporäre Assembly sofort.
Wahrscheinlich liegt das an den ziemlich radikalen Änderungen in der Serialisierungslogik, die Sie mit dem XmlAttributeOverrides-Argument erreichen können, das in der Kompilierzeit von Tools wie sgen nicht vorhergesehen werden kann.
Wenn Sie Dinge vorkompilieren müssen, müssen Sie die XmlAttributeOverrides vermeiden. Wenn dies nicht möglich ist, erstellen Sie die erforderlichen XmlSerializer-Instanzen im Voraus, möglicherweise in einem Hintergrundthread.
Nur für Ihr Interesse, hier ist der Code für den Standardkonstruktor (prüft den Cache und versucht eine vorgenerierte Assembly zu finden):
%Vor%Und hier ist der Konstruktor, der mit XmlAttributeOverrides verwendet wird (erzeugt immer Serialisierungsassembly):
%Vor%Tags und Links .net xml-serialization sgen