Benutzer mit den meisten Antworten
Serialisierung verschachteltes Array

Frage
-
Hallo!
Ich bekomme einen Serialisierungs-Fehler beim Serialisieren einer Klasse (OpenImmo), die verschachtelte Arrays benutzt.
Ich habe die Eigenschaft user_defined_extend der Klasse zustand_angaben
die als verschachteltes Array des Typ's user_defined_extendFeld[][]
deklariert ist:Eigenschaft user_defined_extend:
/// <remarks/> [System.Xml.Serialization.XmlArrayItemAttribute("feld", typeof(user_defined_extendFeld), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)] public user_defined_extendFeld[][] user_defined_extend { get { return this.user_defined_extendField; } set { this.user_defined_extendField = value; } }
Typ user_defined_extendFeld:/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] public partial class user_defined_extendFeld { private string nameField; private string wertField; private string[] typField; private string[] modusField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string name { get { return this.nameField; } set { this.nameField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string wert { get { return this.wertField; } set { this.wertField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute("typ", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string[] typ { get { return this.typField; } set { this.typField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute("modus", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string[] modus { get { return this.modusField; } set { this.modusField = value; } } }
und instanziere Objekte, ohne Fehler(Meldung):
user_defined_extendFeld ef = new user_defined_extendFeld(); ef.name = "EnergieAusweisPiktogramm"; ef.typ = new string[] { "byte" }; daten datenEAPiktogramm = new daten(); // Daten des EA-Piktogramms initalisieren datenEAPiktogramm.Item = System.IO.File.ReadAllBytes(zEAPDatei); // Byte-Array der EA-Piktogramm-Bilddatei ef.wert = System.Text.Encoding.Default.GetString((byte[])datenEAPiktogramm.Item); // Byte-Werte als String za.user_defined_extend = new user_defined_extendFeld[][] { new user_defined_extendFeld[] { ef } };
Beim anschließendem Serialisieren des OpenImmo-Objektes:
public static void SaveXML<T>(openimmo o, string fileName) { using (var sw = new System.IO.StreamWriter(fileName)) { new System.Xml.Serialization.XmlSerializer(typeof(T)).Serialize(sw, o); } }
wird folgender Fehler geworfen:
System.InvalidOperationException wurde nicht von Benutzercode behandelt. HResult=-2146233079 Message=Temporäre Klasse kann nicht generiert werden (result=1). error CS0030: Eine Konvertierung vom Typ 'OpenImmo1.user_defined_extendFeld[]' in 'OpenImmo1.user_defined_extendFeld' ist nicht möglich. error CS0029: Eine implizite Konvertierung vom Typ 'OpenImmo1.user_defined_extendFeld' in 'OpenImmo1.user_defined_extendFeld[]' ist nicht möglich.
Die OpenImmo-Klassen wurden (automatisch) mit der xsd.exe erstellt.
Auszug aus der Schema Datei:
<xsd:element name="zustand_angaben"> <xsd:complexType> <xsd:sequence> <xsd:element ref="baujahr" minOccurs="0"/> ... <xsd:element ref="user_defined_extend" minOccurs="0" maxOccurs="unbounded"/><!--$V120--> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="user_defined_extend"> <xsd:complexType> <xsd:sequence> <xsd:element name="feld" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="wert" type="xsd:string"/> <xsd:element name="typ" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="modus" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element>
Die ("gefüllte") Instanz der OpenImmo-Klasse ist doch korrekt!
Warum kann beim Serialisieren das user_defined_extendFeld-Array nicht in die Eigenschaft user_defined_extendFeld umgewandelt werden???
Fred.
- Bearbeitet perlfred Dienstag, 6. März 2018 14:16
Antworten
-
Hallo Peter!
Vielen Dank für deine Antwort!!!
Da die Klassen von der Microsoft MSD.exe selbst erstellt wurden, dachte ich, dass wenn man das Objektmodell richtig füllt, die Serialisierung immer klappen müßte ;-). ???
Sobald ich aber die user_defined_extendedFeld[][] Deklaration einkommentiere, stürzt die Serialisierung ab, egal ob ich sie verwende oder nicht. :-(
Ein Umstellen der Klassen ist auch nicht gut, da ich, wenn neue Version(en) der Schemadatei von OpenImmo herausgegeben werden, ich diese wieder (mit MSD.exe) in die C# Klassen konvertieren möchte und nicht jedesmal daran denken möchte, Änderungen zu übertragen.
Da ich jetzt (siehe heutigen Post: new XmlNode) eigene Felder auch über den Weg user_defined_anyfield definieren kann, werde ich mir so behelfen.
Trotzdem vielen Dank für deine Antwort!
- Bearbeitet perlfred Dienstag, 6. März 2018 17:10
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 26. März 2018 12:36
- Als Antwort markiert Stefan FalzModerator Samstag, 31. März 2018 18:25
Alle Antworten
-
Hi,
die Eigenschaft user_defined_extend ist bei Dir ein Jaged Array mit Elementen vom Typ user_defined_extendFeld. Das XmlArrayItemAttribute ist aber vom Typ user_defined_extendFeld. Ich habe es nicht getestet, aber mir scheint so etwas nicht serialisierbar zu sein.Anstelle sich an den Jagged Arrays festzubeißen würde ich das Konzept auf XElement umstellen. Das kann die Sache stark vereinfachen.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Hallo Peter!
Vielen Dank für deine Antwort!!!
Da die Klassen von der Microsoft MSD.exe selbst erstellt wurden, dachte ich, dass wenn man das Objektmodell richtig füllt, die Serialisierung immer klappen müßte ;-). ???
Sobald ich aber die user_defined_extendedFeld[][] Deklaration einkommentiere, stürzt die Serialisierung ab, egal ob ich sie verwende oder nicht. :-(
Ein Umstellen der Klassen ist auch nicht gut, da ich, wenn neue Version(en) der Schemadatei von OpenImmo herausgegeben werden, ich diese wieder (mit MSD.exe) in die C# Klassen konvertieren möchte und nicht jedesmal daran denken möchte, Änderungen zu übertragen.
Da ich jetzt (siehe heutigen Post: new XmlNode) eigene Felder auch über den Weg user_defined_anyfield definieren kann, werde ich mir so behelfen.
Trotzdem vielen Dank für deine Antwort!
- Bearbeitet perlfred Dienstag, 6. März 2018 17:10
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 26. März 2018 12:36
- Als Antwort markiert Stefan FalzModerator Samstag, 31. März 2018 18:25