Benutzer mit den meisten Antworten
XmlSerializer - Server - Client - Implementierungsfrage

Frage
-
Hallo,
das hat mich weitergebracht. Ich bin sehr überrascht, dass das so einfach geht!
http://www.dotnetjohn.com/articles.aspx?articleid=173
Deshalb wäre ich auf den Rat von Frank & Co. sehr froh!! Bitte, bitte Frank sag noch was......DANKE.
Mache ich es richtig?
SERVER: ich behandle das wie ein String. Für was brauche ich dann die Länge noch.....!?!?!?
public string ssssss_111() { var s = new XmlSerializer(typeof(List<CODE>)); StringBuilder sb = new StringBuilder(); XmlWriter wr = XmlWriter.Create(sb); // XmlTextWriter wrt = XmlTextWriter.Create(sb); s.Serialize(wr, StructResponsePlcPartReceivedPRequestPlcPartProcessed.ListCodes); string ss = sb.ToString(); //String XmlizedString = null; //MemoryStream memoryStream = new MemoryStream(); //memoryStream = (MemoryStream)xmlTextWriter.BaseStream; //XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); //return XmlizedString; var s2 = new XmlSerializer(typeof(List<CODE>)); StringReader sr = new StringReader(ss); List<CODE> returnList = (List<CODE>)s2.Deserialize(sr); return ss; }
CLIENT: Ich bin so froh, ich habe die Liste :-)
ServerObjectReceived = Bussystem.GetReceiveObject();
var s2 = new XmlSerializer(typeof(List<RBA_CODE>));
string ss = ServerObjectReceived as string;
StringReader sr = new StringReader(ss);
List<RBA_CODE> returnList = (List<RBA_CODE>)s2.Deserialize(sr);
Clientseitig!
public override void Write(string data, int size) { try { tcpStream = tcpClient.GetStream(); UTF8Encoding encoding = new UTF8Encoding(); byte[] ba = encoding.GetBytes(data); System.Diagnostics.Trace.WriteLine("\r\nÜbertrage zum Server : \"" + data + "\""); tcpStream.Write(ba, 0, ba.Length); byte[] buffer = new byte[maxBuffer]; int gelesen = tcpStream.Read(buffer, 0, maxBuffer); string empfangen = encoding.GetString(buffer, 0, gelesen); ReceiveObject = empfangen; System.Diagnostics.Trace.WriteLine("Empfangen: \"" + empfangen + "\""); } catch (Exception exp) { System.Diagnostics.Trace.WriteLine(exp.Message); if (tcpStream != null) tcpStream.Close(); if (tcpClient != null) tcpClient.Close(); NeuVerbinden(); return; } }
Grüße Andreas
Antworten
-
Hallo Andreas,
ja, ich denke, das in SerializeObject ist auch ok.
Wenn man über UTF-16 gehen würde, würde ich es über den StringWriter machen, aber es ist ok, es auf UTF8 zu belassen. Letztlich führen aber viele Wege nach Rom.
Wenn das Objekt eine Liste ist, sollte man dies evtl. auch etwas typsicherer gestalten.
Beispielsweise so:public Form1() { InitializeComponent(); Animal a1 = new Animal { MyProperty = 42, MyProperty2 = 43 }; Animal a2 = new Animal { MyProperty = 44, MyProperty2 = 45 }; List<Animal> liste = new List<Animal> { a1, a2 }; string serialized = SerializeObject(liste); } private String UTF8ByteArrayToString(Byte[] characters) { UTF8Encoding encoding = new UTF8Encoding(); string constructedString = encoding.GetString(characters); return (constructedString); } public string SerializeObject<T>(List<T> pListe) { try { string xmlizedString = null; MemoryStream memoryStream = new MemoryStream(); XmlSerializer xs = new XmlSerializer(typeof(List<T>)); XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); xs.Serialize(xmlTextWriter, pListe); memoryStream = (MemoryStream)xmlTextWriter.BaseStream; return UTF8ByteArrayToString(memoryStream.ToArray()); } catch (Exception e) { System.Console.WriteLine(e); return null; } }
Also ein wenig mehr in Richtung:
[Mit dem XmlSerializer eigene Objekte serialisieren und deserialisieren]
Aber wie gesagt, viele Wege führen dahin.
ciao Frank- Als Antwort markiert Andreas Bauer2 Mittwoch, 23. Februar 2011 19:38
-
Hallo Andreas,
- Vielleicht noch zum Abschluß, wann sollte man UTF16, wann UTF8 nehmen.
gut - also Deinen Frage ist ja im Kontext der TcpClient-Kommunikation gestellt - nur für andere.
Beide Encodings werden mittlerweile gut unterstützt, aber nimm mal eher UTF8. Ein Grund ist, dass das weiter verbreitet ist und in verschiedensten Standards benutzt wird. Die IETF verlangt ja von allen neuen Internetkommunikationsprotokollen, dass die Zeichenkodierung deklariert wird und dass UTF-8 eine der unterstützten Kodierungen ist. UTF-16 ist eher optimiert für gewisse häufig gebrauchten Zeichen. Theoretisch könnte die Wahl eines geeigneten Encodings also zum Beispiel Bytes bei der Übertragung sparen. Aber Dein Szenario ist da glaube ich noch nicht an der Stelle, an der das spürbar wäre.
Später wirst Du Dinge sicher auch mal mit WCF umsetzen, da ist der Aufwand eines geeigneteren Protokolles dann sehr gering und konfigurierbar.
ciao Frank- Als Antwort markiert Andreas Bauer2 Mittwoch, 23. Februar 2011 20:22
Alle Antworten
-
Hallo Andreas,
- > das hat mich weitergebracht. Ich bin sehr überrascht, dass das so einfach geht!
CLIENT: Ich bin so froh, ich habe die Liste :-)
:-) schön, dass Du meinen Tip da umsetzen konntest und es wohl der richtige war.
- SERVER: ich behandle das wie ein String. Für was brauche ich dann die Länge noch.....!?!?!?
Du hast da zum einen IMHO Recht. Man braucht die Länge nicht unbedingt, das ist manchmal in anderen Szenarien wichtig.
Bei Read ggf. noch einmal auf die Hinweise dort achten:[NetworkStream.Read-Methode (System.Net.Sockets)]
http://msdn.microsoft.com/de-de/library/system.net.sockets.networkstream.read.aspxIch habe Deine Quellcode aber jetzt nicht 100% verifiziert.
ciao Frank - > das hat mich weitergebracht. Ich bin sehr überrascht, dass das so einfach geht!
-
- SERVER: ich behandle das wie ein String. Für was brauche ich dann die Länge noch.....!?!?!?
Du hast da zum einen IMHO Recht. Man braucht die Länge nicht unbedingt, das ist manchmal in anderen Szenarien wichtig.
Bei Read ggf. noch einmal auf die Hinweise dort achten:Hallo Frank,
Danke dass Du noch mit mir redest;-)
OK.
var s = new XmlSerializer(typeof(List<CODE>)); StringBuilder sb = new StringBuilder(); XmlWriter wr = XmlWriter.Create(sb); // XmlTextWriter wrt = XmlTextWriter.Create(sb); s.Serialize(wr, StructResponse.ListCodes); string ss = sb.ToString(); Da bin ich unsicher.
public String SerializeObject ( Object pObject ){
try
{
String XmlizedString = null;
MemoryStream memoryStream = new MemoryStream ( );
XmlSerializer xs = new XmlSerializer ( typeof ( Animal ) );
XmlTextWriter xmlTextWriter = new XmlTextWriter ( memoryStream, Encoding.UTF8 );
xs.Serialize ( xmlTextWriter, pObject );
memoryStream = ( MemoryStream ) xmlTextWriter.BaseStream;
XmlizedString = UTF8ByteArrayToString ( memoryStream.ToArray ( ) );
return XmlizedString;
}
catch ( Exception e )
{
System.Console.WriteLine ( e );
return null;
}
}
Die machen das so. Encoding.
Das machst Du ja in Deiner Socketklasse.
Das reicht doch, oder?
Ich will es einfach richtig und gut machen.
Grüße Andreas
-
Hallo Andreas,
ja, ich denke, das in SerializeObject ist auch ok.
Wenn man über UTF-16 gehen würde, würde ich es über den StringWriter machen, aber es ist ok, es auf UTF8 zu belassen. Letztlich führen aber viele Wege nach Rom.
Wenn das Objekt eine Liste ist, sollte man dies evtl. auch etwas typsicherer gestalten.
Beispielsweise so:public Form1() { InitializeComponent(); Animal a1 = new Animal { MyProperty = 42, MyProperty2 = 43 }; Animal a2 = new Animal { MyProperty = 44, MyProperty2 = 45 }; List<Animal> liste = new List<Animal> { a1, a2 }; string serialized = SerializeObject(liste); } private String UTF8ByteArrayToString(Byte[] characters) { UTF8Encoding encoding = new UTF8Encoding(); string constructedString = encoding.GetString(characters); return (constructedString); } public string SerializeObject<T>(List<T> pListe) { try { string xmlizedString = null; MemoryStream memoryStream = new MemoryStream(); XmlSerializer xs = new XmlSerializer(typeof(List<T>)); XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); xs.Serialize(xmlTextWriter, pListe); memoryStream = (MemoryStream)xmlTextWriter.BaseStream; return UTF8ByteArrayToString(memoryStream.ToArray()); } catch (Exception e) { System.Console.WriteLine(e); return null; } }
Also ein wenig mehr in Richtung:
[Mit dem XmlSerializer eigene Objekte serialisieren und deserialisieren]
Aber wie gesagt, viele Wege führen dahin.
ciao Frank- Als Antwort markiert Andreas Bauer2 Mittwoch, 23. Februar 2011 19:38
-
ja, ich denke, das in SerializeObject ist auch ok.
Wenn man über UTF-16 gehen würde, würde ich es über den StringWriter machen, aber es ist ok, es auf UTF8 zu belassen. Letztlich führen aber viele Wege nach Rom.Hallo Frank,
ja Du sagt es. Viele Wege gibt es.
Vielleicht noch zum Abschluß, wann sollte man UTF16, wann UTF8 nehmen.
Welche Kriterien kennst du...?
Grüße Andreas
- Bearbeitet Andreas Bauer2 Mittwoch, 23. Februar 2011 19:40 Formatierung
-
Hallo Andreas,
- Vielleicht noch zum Abschluß, wann sollte man UTF16, wann UTF8 nehmen.
gut - also Deinen Frage ist ja im Kontext der TcpClient-Kommunikation gestellt - nur für andere.
Beide Encodings werden mittlerweile gut unterstützt, aber nimm mal eher UTF8. Ein Grund ist, dass das weiter verbreitet ist und in verschiedensten Standards benutzt wird. Die IETF verlangt ja von allen neuen Internetkommunikationsprotokollen, dass die Zeichenkodierung deklariert wird und dass UTF-8 eine der unterstützten Kodierungen ist. UTF-16 ist eher optimiert für gewisse häufig gebrauchten Zeichen. Theoretisch könnte die Wahl eines geeigneten Encodings also zum Beispiel Bytes bei der Übertragung sparen. Aber Dein Szenario ist da glaube ich noch nicht an der Stelle, an der das spürbar wäre.
Später wirst Du Dinge sicher auch mal mit WCF umsetzen, da ist der Aufwand eines geeigneteren Protokolles dann sehr gering und konfigurierbar.
ciao Frank- Als Antwort markiert Andreas Bauer2 Mittwoch, 23. Februar 2011 20:22