Laden...

Probleme bei Serialisieren eines Objete in ein XML

Erstellt von Foermchen82 vor 13 Jahren Letzter Beitrag vor 13 Jahren 876 Views
F
Foermchen82 Themenstarter:in
101 Beiträge seit 2005
vor 13 Jahren
Probleme bei Serialisieren eines Objete in ein XML

Hallo zusammen,

ich habe ein XSD, als welchem ich mittels xsd.exe C#-Klassen erzeuge. Diese sehen so aus:


//------------------------------------------------------------------------------
// <auto-generated>
//     Dieser Code wurde von einem Tool generiert.
//     Laufzeitversion:2.0.50727.3615
//
//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
//     der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

// 
// Dieser Quellcode wurde automatisch generiert von xsd, Version=2.0.50727.42.
// 
namespace TypeTest {
    using System.Xml.Serialization;
    
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlRootAttribute("TypeTest", Namespace="", IsNullable=false)]
    public partial class TypeTestMessage : SuperMessage {
        
        private ChoiceType1 itemField;
        
        private ItemChoiceType itemElementNameField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Choice1", typeof(ChoiceType1))]
        [System.Xml.Serialization.XmlElementAttribute("Choice2", typeof(ChoiceType2))]
        [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
        public ChoiceType1 Item {
            get {
                return this.itemField;
            }
            set {
                this.itemField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public ItemChoiceType ItemElementName {
            get {
                return this.itemElementNameField;
            }
            set {
                this.itemElementNameField = value;
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class ChoiceType1 {
        
        private int[] elementField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Element")]
        public int[] Element {
            get {
                return this.elementField;
            }
            set {
                this.elementField = value;
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class ChoiceType2 {
        
        private int[] elementField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Element")]
        public int[] Element {
            get {
                return this.elementField;
            }
            set {
                this.elementField = value;
            }
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIncludeAttribute(typeof(TypeTestMessage))]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class SuperMessage {
        
        private int idField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public int id {
            get {
                return this.idField;
            }
            set {
                this.idField = value;
            }
        }
    }
    
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(IncludeInSchema=false)]
    public enum ItemChoiceType {
        
        /// <remarks/>
        Choice1,
        
        /// <remarks/>
        Choice2,
    }
}

Das XSD sieht so aus:


<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:d="http://www.w3.org/1999/xhtml" xmlns:info="urn:ipmamatch:info-elements" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" elementFormDefault="qualified">

	<xsd:complexType name="SuperMessage">
		<xsd:attribute name="id" type="xsd:int" use="required"/>
	</xsd:complexType>
	
	<xsd:element name="TypeTest" type="TypeTestMessage"></xsd:element>
	
	<xsd:complexType name="TypeTestMessage"><xsd:complexContent>
		<xsd:extension base="SuperMessage">
		<xsd:sequence>

			<xsd:choice>
			<xsd:element name="Choice1" minOccurs="0" type="ChoiceType1"></xsd:element>

			<xsd:element name="Choice2" minOccurs="0" type="ChoiceType2"></xsd:element>
			</xsd:choice>		

		</xsd:sequence>
		</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
	
	<xsd:complexType name="ChoiceType1">
		<xsd:sequence>
		<xsd:element name="Element" type="xsd:int" minOccurs="2" maxOccurs="unbounded"></xsd:element>
		</xsd:sequence>
	</xsd:complexType>
	
	<xsd:complexType name="ChoiceType2">
		<xsd:sequence>
			<xsd:element name="Element" type="xsd:int" minOccurs="2" maxOccurs="unbounded"></xsd:element>
		</xsd:sequence>
	</xsd:complexType>
	
	
</xsd:schema>

folgendermaßen serialisiere ich zur Zeit ein Objekt in ein XML:


 TypeTest.TypeTestMessage message = new TypeTest.TypeTestMessage();
            message.id = 33;
            message.ItemElementName = TypeTest.ItemChoiceType.Choice1;
            message.Item = new TypeTest.ChoiceType1();
            message.Item.Element = new int[] { 1, 2, 3, 4 };

            String XmlizedString = null;
            MemoryStream memoryStream = new MemoryStream();
            XmlSerializer xs = new XmlSerializer(typeof(TypeTest.TypeTestMessage));
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

            xs.Serialize(xmlTextWriter, message);
            memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
            XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());

            Console.WriteLine(XmlizedString);
            Console.ReadLine();

soweit so gut. Jedoch bekomme ich folgende Fehlermeldung:

"Temporäre Klasse kann nicht generiert werden (result=1).\r\nerror CS0030: Der Typ TypeTest.ChoiceType1 kann nicht in TypeTest.ChoiceType2 konvertiert werden.\r\nerror CS0029: Der Typ TypeTest.ChoiceType2 kann nicht implizit in TypeTest.ChoiceType1 konvertiert werden.\r\n"

Ich verstehe jedoch das Problem nicht! Die C# Klasse habe ich mir mit xsd.exe aus einem XSD erzeugt.

Ich denke, der Fehler liegt schon bei der Klassenerzeugung via xsd.exe. Hier wird für das itemFeld direkt ChoiceType1 verwendet. Verwende ich nun bei der Instanzierung jedoch als ItemElementName ChoiceType2 ist mir klar, dass es kracht. Jedoch kracht es auch bei ChoiceType1.

kann das bitte einer erklären bzw weiterhelfen??

Danke im voraus!!

Danke!!

F
Foermchen82 Themenstarter:in
101 Beiträge seit 2005
vor 13 Jahren

ich habe diese Beitrag gelöscht, da ich den obigen ergänzt habe. Das Problem ist jedoch noch offen!!