| 

.NET C# Java Javascript Exception

1
Hallo,
ich habe folgende xsd-Datei:

Der ClientType soll wieder eine Liste/Array an ClientType's beinhalten.

<xs:complexType name="clientType">
<xs:sequence>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="client" type="clientType"></xs:element>
</xs:sequence>
</xs:sequence>
<xs:attribute name="filter" type="xs:string" use="required" />
</xs:complexType>
...
<xs:element name="operationalAlarms">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="alarm">
<xs:complexType>
<xs:sequence>
<xs:element name="clients">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="client" type="clientType">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>


Beim Serialisieren bekomme ich eine Exception: zirkuläre Verweise nicht serialisierbar.
Das Problem liegt am ClientType. Aber wie kann ich es anders formulieren?

Jemand eine Idee?
Danke
Marcus
News:
04.07.2014
MarcusS 207 1 5
MarcusS 207 1 5
2 Antworten
2
Hi Marcus,

das Problem liegt am Serializer, da dieser nicht mit Referenzen (Pointern) umgehen kann. Er würde für jeden Verweis auf eine andere Klasse diese neu Serialisieren bzw. Instanziieren. Beim Serialisieren würde also ein unendlich großer Datenstrom entstehen.

In C# hättest du beispielsweise folgendes: A verweist auf B und B verweist auf A. Der Serializer macht daraus aber: A verweist auf B, B verweist auf C (!), C verweist auf D, ...

Als Lösung müsstest du dich in den Serialisierungsprozess einklinken und das Verhalten überschreiben. Der XML Serializer muss den zirkulären Verweis ignorieren (XmlIgnore) und den Verweis von dem Vater auf die Kinder programmatisch setzen, indem du die Schnittstelle IXmlSerializable implementiert und die Methode ReadXml/WriteXml entsprechend anpasst.

[Serializable]
public class Child
{
public Child()
{
}

public string Foo { get; set; }

[XmlIgnore]
public Parent Parent { get; set; }
}

[Serializable]
public class Parent
{
public Parent()
{
}

#region IXmlSerializable Members

public System.Xml.Schema.XmlSchema GetSchema()
{
throw new NotImplementedException();
}

public void ReadXml(System.Xml.XmlReader reader)
{
//Reading Parent content
//Reading Child
Child.Parent = this;
}

public void WriteXml(System.Xml.XmlWriter writer)
{
//Writing Parent and Child content
}

#endregion

public string Boo { get; set; }

public Child Child { get; set; }
}

Hier ist die Lösungen noch einmal in Detail beschreiben.

Gruß, Thomas
05.07.2014
ThomasMentzel 123 5
0
besten Dank... das funktioniert.
07.07.2014
MarcusS 207 1 5

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH