Autor Beitrag
Webo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: Sa 29.12.12 01:07 
Hallo zusammen,

ich taste mich im Moment vorsichtig an die Netzwerkprogrammierung mit C# heran und stoße nun auf folgendes Problem. Der Code klappt, aber nur unter Windows. Den Server der Anwendung soll allerdings mit Mono auf Linux laufen, wo hingegen nicht alles läuft.

Ich sende zur einfachen Handhabung serialisierte (XML) Objekte mit TCP übers Netz.

So eine Batzen sieht dann auch mal so aus:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
<?xml version="1.0" encoding="utf-16"?>
<ChatEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ID>0</ID>
<Name>Webo</Name>
<Message>Hallo!</Message>
</ChatEntry>


Serialisiert wird mit

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
        public static string Serialize<T>(T item)
        {
            MemoryStream memStream = new MemoryStream();
            using (XmlTextWriter textWriter = new XmlTextWriter(memStream, Encoding.Unicode))
            {
                System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
                serializer.Serialize(textWriter, item);

                memStream = textWriter.BaseStream as MemoryStream;
            }
            if (memStream != null)
                return Encoding.Unicode.GetString(memStream.ToArray());
            else
                return null;
        }

        public static T Deserialize<T>(string xmlString)
        {
            if (xmlString.Equals(""))
                return default(T);

            using (MemoryStream memStream = new MemoryStream(Encoding.Unicode.GetBytes(xmlString)))
            {
                System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

                return (T)serializer.Deserialize(memStream);
            }
        }


Beim De-Serialisieren auf der Server-Seite erhalte ich mit Mono (2.6.7, Debian 6) folgende Fehlermeldung

"a name did not start with a legal character -1 (?) Line 1, position 2."

Das Xml hab ich in einem Validator überpüft, ist alles in Ordnung, unter Windows funktioniert alles einwandfrei. Unter Mono 2.10.irgendwas in einer VM läuft es auch. Folglich liegt anscheinend ein Bug in dieser Mono-Version vor. Da ich aber nur diese Mono Version auf dem Server zur Verfügung habe, hoffe ich, dass das irgendwie passt.

Weiß jemand Rat an was genau sich der De-Serialisierer stört, sodass man eventuell den Fehler umgehen kann? Ich hatte erst vermutet, dass es an dem DateTime liegt, nachdem ich das aber rausgenommen hab hat sich nix verbessert ...


Grüße

Webo

_________________
Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
Webo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: Sa 29.12.12 11:12 
So, Problem durch manuelle Installation von Mono 2.10 behoben ...

_________________
Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.