none
Datenstrukturen in Klassen, Listen für Server, Client; Socket App. RRS feed

  • Frage

  • Hallo,

     

    ich habe eine C# Anwendung

       App1.exe + App2.exe

     

    ich habe eine C# Anwendung

       App1.exe 

    und eine C++ Anwendung

       App2.exe

     

    Bitte:

    Wie könnte ich schnell die Datenstrukturen in Klassen, Listen bringen. Was würde sich gut dafür eignen.

     

    App1.exe mache ich neu. App2 gibt es für ein Produkt schon und ist in C++, deshalb die Socketgeschichte. 

    Alles soll zunächst in C# gehen, später soll die App1.exe auch App2.exe in C++ beliefern.

     mein Ziel ist:

        App1.EXE -- Server ----- SOCKET -----  App2.EXE -- Client´

        UI

           

                            <--- Frage     ("1001;SwitchOn;200,201,400,300,500"); Event, Asynchron!!!

                 Antwort    --->           ("1001;ACK")

     

                            <--- Frage     ("1002;GetContents");

                 Antwort    --->           ("1002;0-1212324234242,1-1212324234200,2-1212324234201,3-1212324234202,

                                                  4-1212324234203,5-1212324234204,6-1212324234205,7-1212324234206")

                                   

                                        Soll eine Liste sein, also Index und Inhalt

                                        Wie wäre das am einfachsten zu parsen?

                                        Split erst KOMMA, dann Minus ?

                                          0 1212324234242

                                          1-1212324234200

                                          2-1212324234201

     

                            <--- Frage     ("1003;SetResults");

                                           ("1003;0-1-ObjektTyp1-A,1-1-ObjektTyp2-B,

                                                  2-1-ObjektTyp1-A,3-1-ObjektTyp2-B,

                                                  4-1-ObjektTyp1-A,5-0-ObjektTyp1-F")

                                          Struktur:

                                           Index-Ergebnis-Objekt-Klassifizierung

                                            0-1-ObjektTyp1-A

                                            1-1-ObjektTyp2-B     

     

                 Antwort    --->           ("1001;ACK")

                                         oder

                                           ("1001;Err")

                                         oder Timeout!

     Grüße Andreas

    Mittwoch, 16. Februar 2011 20:06

Antworten

  • Hallo Andreas,

    • > Du meinst ich könnte eine komplette Struktur via Deiner Socketklasse übertragen!?!?

    ja.
    Und richtig, bei andere Sprachen bis hin zu Java etc. sollte man eben auf Interoperabilität achten. Also eher zum Beispiel mit dem XmlSerializer arbeiten (nicht mehr mit dem BinarySerializer - und dann ggf. weiter mit Base64 oder gar nicht weiter verkleinern) in Richtung WebService (nebenbei, was in WCF ja alles einstellbar ist). Das kann dann alles auch C++ und Java etc. lesen und ist durch XML-Basierung viel besser standardisiert. Man kann für solche Sachen auch gut OData-Dienste [OData interoperability] einsetzen, was dann aber mehr DB-orientiert ist.

     


    ciao Frank
    • Als Antwort markiert Andreas Bauer2 Donnerstag, 17. Februar 2011 18:49
    Donnerstag, 17. Februar 2011 15:30

Alle Antworten

  •  

    >ja, geht etwas schnell, ich schau mal heut abend mal in den Code rein, ich hatte eine andere Stelle angepasst als Du jetzt getestet hattest.

    @Frank, im Zuge des Servers (anderer Thread), vielleicht hast Du hier auch noch Tipps.

    Grüße Andreas

     

    Donnerstag, 17. Februar 2011 13:17
  • Hallo Andreas,

    naja, das hatte ich geahnt. Solche Instanz-Serialisierung über den Draht zu kommunizieren ist natürlich viel sauberer mit WCF machbar - ist genau dessen Domäne. Durch interoperable Protokolle kann man dann erreichen, dass sie maximal mit anderen Sprachen und Umgebungen zusammenspielt.

    Aber gut, Dein Ausgangspunkt ist jetzt TcpClient und dann könntest Du zum Beispiel so Deine Klassen (in die Du Dein JSON-artiges String-Format wohl auflösen solltest), die Du dann auf dem Client und dem Server aus einer gesharten DLL holen solltest.

    [Serialize Object to a Base64 String - C# - Snipplr Social Snippet Repository]
    http://snipplr.com/view/8013/serialize-object-to-a-base64-string/

    nebst ... DataContractJsonSerializer

     


    ciao Frank
    Donnerstag, 17. Februar 2011 13:38
  • Hallo Frank,

    >naja, das hatte ich geahnt.

    ;-) schlimm?!?!

    public static string SerializeBase64(object o)
    {
      // Serialize to a base 64 string
      byte[] bytes;
      long length = 0;
      MemoryStream ws = new MemoryStream();
      BinaryFormatter sf = new BinaryFormatter();
      sf.Serialize(ws, o);
      length = ws.Length;
      bytes = ws.GetBuffer();
      string encodedData = bytes.Length + ":" + Convert.ToBase64String(bytes, 0, bytes.Length, Base64FormattingOptions.None);
      return encodedData;
    }
    

    sorry ich hoffe ich nerve nicht.

    Du meinst ich könnte eine komplette Struktur via Deiner Socketklasse übertragen!?!?

    Klasse List 10 Einträge caste es als object, versende es, empfange, caste es in meine Struktur und die Welt ist in Ordnung, oder?

                sf.DeSerialize(ws, o); beim empfangen

    Oh, es gibt so viele Ideen.

    Grüße Andreas

    Problem:

    FALL1 IO -> C#  --- C#

    FALL2 NIO   C# ---C++,MFC wie

    Donnerstag, 17. Februar 2011 14:14
  • Hallo Andreas,

    • > Du meinst ich könnte eine komplette Struktur via Deiner Socketklasse übertragen!?!?

    ja.
    Und richtig, bei andere Sprachen bis hin zu Java etc. sollte man eben auf Interoperabilität achten. Also eher zum Beispiel mit dem XmlSerializer arbeiten (nicht mehr mit dem BinarySerializer - und dann ggf. weiter mit Base64 oder gar nicht weiter verkleinern) in Richtung WebService (nebenbei, was in WCF ja alles einstellbar ist). Das kann dann alles auch C++ und Java etc. lesen und ist durch XML-Basierung viel besser standardisiert. Man kann für solche Sachen auch gut OData-Dienste [OData interoperability] einsetzen, was dann aber mehr DB-orientiert ist.

     


    ciao Frank
    • Als Antwort markiert Andreas Bauer2 Donnerstag, 17. Februar 2011 18:49
    Donnerstag, 17. Februar 2011 15:30
    • > Du meinst ich könnte eine komplette Struktur via Deiner Socketklasse übertragen!?!?

    ja.
    Und richtig, bei andere Sprachen bis hin zu Java etc. sollte man eben auf Interoperabilität achten. Also eher zum Beispiel mit dem XmlSerializer arbeiten (nicht mehr mit dem BinarySerializer - und dann ggf. weiter mit Base64 oder gar nicht weiter verkleinern) in Richtung WebService (nebenbei, was in WCF ja alles einstellbar ist). Das kann dann alles auch C++ und Java etc. lesen und ist durch XML-Basierung viel besser standardisiert. Man kann für solche Sachen auch gut OData-Dienste [OData interoperability] einsetzen, was dann aber mehr DB-orientiert ist.

     

    Hallo Frank,

    was soll ich sagen, Superidee! Wie immer!

    Das wäre doch was für Deine Sammlung, sagen wir Download5.ZIP

    Für das Prinzip

      Objekt

            Class Info         int id; string content.

            Liste mit n Objekten also Infos

    Senden und Empfangen

    •    in C# Senden und Empfangen
    •    in C# Senden und Empfangen in C++

    Wäre doch ein Tipp an Dich. Danke vorab!!!

    Grüße Andreas

       oder mit Deinem vorhandenen, geht schneller

      public class Person
      {
       public Person(string name, int alter)
       {
        this.Name = name;
        this.Alter= alter;
       }
    
    

     

    Donnerstag, 17. Februar 2011 18:49