Benutzer mit den meisten Antworten
Fehler beim Generieren einer XML-Serialisierungsassembly mit sgen.exe

Frage
-
Hallo,
ich habe eine weitere Frage in Zusammenhang mit folgendem Thread. Um die Startleistung des XMLSerializers zu erhöhen, wollte ich eine XML-Serialisierungsassembly unter Zuhilfenahme von sgen.exe erstellen. Bei komplexen Objekten, wie in meinem Fall, soll das von Vorteil sein (s. Link). Ich führe das Kommando:
"sgen.exe" /assembly:"$(TargetPath)"
nach dem Kompilieren der DLL über ein Script aus. Beim Erstellen erhalte ich folgende Fehlermeldung:
The top XML element 'cacheOwner' from namespace '' references distinct types Geocache.CacheV10.cacheOwner and Geocache.CacheV101.cacheOwner. Use XML attributes to specify another XML name or namespace for the element or types.
Die Klassen erhalten über XML Attribute jeweils andere Namespaces. Der Code ist unten aufgeführt:
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038"), _ System.SerializableAttribute(), _ System.Diagnostics.DebuggerStepThroughAttribute(), _ System.ComponentModel.DesignerCategoryAttribute("code"), _ System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True, [Namespace]:=Geocache.Constants.CACHE10)> _ Public Class cacheOwner ... End Class
und
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038"), _ System.SerializableAttribute(), _ System.Diagnostics.DebuggerStepThroughAttribute(), _ System.ComponentModel.DesignerCategoryAttribute("code"), _ System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True, [Namespace]:=Geocache.Constants.CACHE101)> _ Public Class cacheOwner ... End Class
Die Namespaces sind in der Klasse Constants untergebracht und sehen folgendermassen aus:
Public Class Constants Public Const GPX10 As String = "http://www.topografix.com/GPX/1/0" Public Const GPX11 As String = "http://www.topografix.com/GPX/1/1" Public Const CACHE10 As String = "http://www.groundspeak.com/cache/1/0" Public Const CACHE101 As String = "http://www.groundspeak.com/cache/1/0/1" Public Const CACHE11 As String = "http://www.groundspeak.com/cache/1/1" Public Const OPENCACHE10 As String = "http://www.opencaching.com/xmlschemas/opencaching/1/0" End Class
Weshalb kommt sgen.exe damit nicht klar? Kann mir jemand helfen?Gruß, LittleBlueBird
- Bearbeitet LittleBlueBird Montag, 5. März 2012 18:39
Antworten
-
Hallo Robert,
wie bereits in meiner vorherigen Antwort aufgeführt, habe ich die Klassen in mehrere DLLs aufgeteilt. Damit konnte ich auch die Serialisierungsassemblies mit sgen.exe generieren. Wünschenswert wäre jedoch, die Klassen in eine DLL zu packen. Aber dann funktioniert es mit sgen.exe nicht mehr und dafür scheint es wohl keine Lösung zu geben. Da ich keine Antwort mehr erwarte, kann dieser Thread geschlossen werden. Ich markiere daher meine Antwort als "Lösung".
Gruss, LittleBlueBird
- Bearbeitet LittleBlueBird Montag, 6. Februar 2012 15:33
- Als Antwort markiert LittleBlueBird Montag, 6. Februar 2012 15:33
Alle Antworten
-
Hallo LittleBlueBird,
Könntest Du inzwischen das Problem lösen?
Schau Dir mal die folgenden Links an. Vielleicht können sie Dir weiter helfen.
sgen.exe error: The top XML element from namespace '' references distinct types (http://stackoverflow.com/questions/1467968/classes-in-different-sub-namespaces-all-appear-at-top-level-in-wsdl)
Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo Robert,
besten Dank für Deine Antwort. Die im Link aufgeführte MSDN-Doku habe ich auch gelesen. Ich kann allerdings XmlRootAttribute nicht verwenden, weil cacheOwner nicht das Stammelement (die Stammklasse) ist. Ich könnte zwar die Klassennamen ändern, dann muss ich aber in XmlTypeAttribute die Elementnamen angeben, sonst klappt es mit der Serializierung nicht. Dann habe ich aber die gleiche Fehlermeldung, weil die Namen im Attribut wieder gleich sind.
Es blieb mir somit nichts anderes übrig, als die Klassen in mehrere DLLs aufzuteilen. Es ist zwar nicht schön, aber es funktioniert. Ich sehe meine Frage damit nicht unbedingt als beantwortet bzw. gelöst, denn bei einer DLL klappt es nach wie vor nicht mit sgen.exe. Aber wenn Du als Moderator die Frage als beantwortet siehst, dann kannst du den Thread schließen.
Gruß, LittleBlueBird
-
Hallo LittleBlueBird,
Könntest Du inzwischen dieses Problem lösen?
Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo Robert,
wie bereits in meiner vorherigen Antwort aufgeführt, habe ich die Klassen in mehrere DLLs aufgeteilt. Damit konnte ich auch die Serialisierungsassemblies mit sgen.exe generieren. Wünschenswert wäre jedoch, die Klassen in eine DLL zu packen. Aber dann funktioniert es mit sgen.exe nicht mehr und dafür scheint es wohl keine Lösung zu geben. Da ich keine Antwort mehr erwarte, kann dieser Thread geschlossen werden. Ich markiere daher meine Antwort als "Lösung".
Gruss, LittleBlueBird
- Bearbeitet LittleBlueBird Montag, 6. Februar 2012 15:33
- Als Antwort markiert LittleBlueBird Montag, 6. Februar 2012 15:33