Laden...

XmlSerializer.Deserialize

Letzter Beitrag vor 19 Jahren 21 Posts 9.865 Views
XmlSerializer.Deserialize

Servus Leut !

Kann mir jemand helfen ?

Ich habe Client und Server, Client schickt eine Nachricht an Server, die Nachricht ist
eine Klasse, die mit XmlSerializer.Serialize serialisiert wird.
Das alles klappt wunderbar, die Nachricht erreicht ihr Ziel, aber deserialisieren
kann ich irgendwie nicht 😦
Kommt so ne Exception :

type 'System.InvalidOperationException' occured in system.xml.dll
Additional Information : Fehler im XML-Dokument (0,0)

Die Nachricht-Klasse is so definiert :

namespace XmlMessageClass
{
[Serializable]
public class XmlMessage
{
private int Number1, Number2;
private string Operator;

[XmlElement("Zahl1")]
public int SetGetNumber1
{
get{return(Number1);}
set{Number1 = value;}
}

usw. für jede Variable
}
}

ich versuche auf folgende Weise zu deserialisieren

Die ankommenden Bytes werden von einem NetworkStream
in ein Buffer geschrieben (BytesRead - Array)

dann :
XmlSerializer Serializer = new XmlSerializer(typeof(XmlMessage));
MemoryStream MStream = new MemoryStream();
MStream.Write(BytesRead, 0, BytesRead.Length);
XmlMessage IncomingMessage = new XmlMessage();
// Die nachfolgende Zeile schmeisst Exception
IncomingMessage = (XmlMessage)Serializer.Deserialize(MStream);
ConnectingClient.Close();

Sehe CSharp erst weit 2 Wochen, deswegen wäre schön wenn mir jemand
helfen könnte bzw. erklären wie das geht mit der Deserialisierung.

Danke

habe zwar keine Ahnung woran es liegt, aber als Gedanke: Speichere deine XML-Message als Textdatei ab. prüfe diese dann. villeicht hat sie wirklich einige fehler drin (wegen übertragung, oder encoding, etc.)

Er kann ja offenbar nichtmal den XML-Header erzeugen. Vielleicht ein Namespace-Problem. Oder was mit dem Root-Element.

Original von svenson
Er kann ja offenbar nichtmal den XML-Header erzeugen. Vielleicht ein Namespace-Problem. Oder was mit dem Root-Element.

Wieso kann er keinen header erzeugen, Serialisierung klappt doch, nur Deserialisierung nicht.
Oder ich habe deinen Satz falsch verstanden.

Guck dir mal den Bytestream an, ob da auch wirklich drinsteht was du erwartest und schau mal auf die InnerExceptions.
Habe leider nicht mehr zeit um mir das genauer anzuschauen.

Grüße Christoph

Also im Byte-Stream, der beim Server ankommt steht folgendes :

<?xml version="1.0"?>
<XmlMessageClass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:
xsi="http://www.w3.org/2001/XMLSchema-instance">
<Zahl1>7</Zahl1>
<Zahl2>4</Zahl2>
<Operator>Minus</Operator>
<XmlMessageClass>

Also ich bin kein XML kenner, aber für mich sieht das gut aus, was meint ihr ?

imho müsste am schluss </XmlMessageClass> anstatt von <XmlMessageClass> stehen

Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher. - Albert Einstein

ist das ein Tip-Fehler oder fehlt beim End-Tag ein slash?

<XmlMessageClass>
</XmlMessageClass>

Hallo Chäsi!

Das könnte hier auch das Forum verschluckt haben. Das glaube ich ist hier nur in der Anzeige verkehrt.

Sollte aber besser nix_kapito_csharp entscheiden.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Original von Quallo
Wieso kann er keinen header erzeugen, Serialisierung klappt doch, nur Deserialisierung nicht.
Oder ich habe deinen Satz falsch verstanden.

Nein, ich hab nur nicht richtig gelesen. Die Angabe von (0,0) läßt zumindest aber den Schluss zu, dass er bereits in der allerersten Zeile ein Problem hat.

Andere Idee: Zeichenkodierung?

Original von norman_timo
Hallo Chäsi!

Das könnte hier auch das Forum verschluckt haben. Das glaube ich ist hier nur in der Anzeige verkehrt.

Sollte aber besser nix_kapito_csharp entscheiden.

Ciao
Norman-Timo

Denk ich nicht, da es bei mir sowohl bei Xqgene geht 😉

Aber warten wir mal was nix_kapito_csharp dazu meint!

Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher. - Albert Einstein

Hallo nochmal!

Ja, das Problem kenne ich auch beim einlesen mancher XML Dateien mit Hilfe von MS-XML-DOM.

Sobald ich die allererste Zeile weggelassen hab (<?xml version="1.0"?>) hat die Sache funktioniert.

Wie svenson vermutet, könnte es an der Codierung liegen, vielleicht irgendwie anstreben, dass so etwas dabei rauskommt:

[php]<?xml version="1.0" encoding="utf-8" ?> [/php]

Das hat meine Probleme z. Teil auch gelöst.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Ja, meine Schuld, habe Slash vergessen beim eintippen 😁
Die Idee mit der Codierung ist sehr interessant, werde das mal
ausprobieren...

Eigentlich schreibt der XMLSerializer aber die Codierung immer richtig rein!
Naja, genaugenommen macht das wohl der xmlwriter den man dazwischen klemmt.

Also ich habe alles was vorgeschalgen wurde :

  • encoding
  • ohne 1 Zeile (<?xml version="1.0"?>)
    ausprobiert, aber irgendwie klappt es immer noch nicht !

Schau mal auf die Inner Exceptions des Fehlers.
Da ist doch bestimmt noch mehr zu finden, oder?

Ich bekomme folgendes :

System.Xml.XmlException: Das Stammelement ist nicht vorhanden.
at System.Xml.XmlTextReader.Read()
at System.Xml.XmlReader.MoveToContent()
at Microsoft.Xml.
Serialization.GenerateAssembly.XmlSerializationReader1.Read4_XmlMessage()

?(

Es fehlt also das Stammelement, in meinem Fall ist es ja <XmlMessage> oder ?

Ja, wird normalerweise als RootElement bezeichnet.

Was mir ein wenig spanisch vorkommt:

Das Root-Element hat bei dir den Name der Namespaces, nicht der Klasse.

Füge mal über deiner Root-Klasse folgende Zeile ein:

[System.Xml.Serialization.XmlRootAttribute("XmlMessage", Namespace="", IsNullable=false)]

Nö, klappt trotzdem nicht, aber danke !

Dann würde ich mal den Weg versuchen, den ich immer gehe: Automatisch generierte Klassen.

Baue dir ein XMl-Schema für dein XML und jage das durch xsd.exe. Verwende die generierte Klasse anstelle deiner.

Hallo !

Zuers will ich sagen : Danke an alle, die Lösungsvorschlägen gemacht haben !

Und jetzt...
Die Lösung des Problems :
Vor der Deserialisierung schreibe ich Byte-Strom, den ich empfangen
habe in ein MemoryStream, der dann deserialisiert wird.
Nachdem man in das MemoryStream geschrieben hat, sollte man folgendes
machen :

MemoryStream.Position = 0 ;

Jetzt kann man ruhig deserialisieren, jetzt klappt es 😁

Nochmal Danke an alle !