List<T> to Byte[] umwandeln



  • Hallo Forum,

    ich versuche mich gerade an Netzwerkprogrammierung via TCP/IP. Client und Server laufen soweit und reden prächtig miteinander. Nun habe ich erstmal vor, vom Client aus eine Anfrage an den Server zu schicken, dessen Antwort eine ganze Reihe von Daten beinhalten sollte (Konkret - eine Veranstaltungliste).
    Also hab ich mir gedacht, nehm ich mal List<T>. Bis hierhin wunderbar, im Debugger zeigt er mir auch, das meine List alle Daten die ich erwartet habe beinhaltet.

    Nun will ich die Liste vom Server an den Clienten übertragen und dazu in Byte[] umwandeln. Leider konnte ich dazu weder die passende hin, noch Rückwandlung finden.

    Kann mir da bitte wer einen Tipp geben ?

    Danke, der Nala



  • Stichwort: Serializer (z.B. Xml- oder Binary-)



  • Na ja, man kann zwar schon mit LINQ (konkret: Select + Funktor und dann ToArray) was zusammenfuchteln... aber was spricht dagegen, die Daten manuell nach Byte zu "konvertieren"? 😕



  • GPC schrieb:

    Na ja, man kann zwar schon mit LINQ (konkret: Select + Funktor und dann ToArray) was zusammenfuchteln... aber was spricht dagegen, die Daten manuell nach Byte zu "konvertieren"? 😕

    Sollte die Frage an mich gerichtet sein, dann ist das Problem mein begrenztes wissen 🙂 Ich lese mir im Moment das MSDN zur Serialisation durch, wenn es andere, bessere oder einfachere Wege gibt, bin ich für jede Hilfe dankbar.



  • Auf die Schnelle:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    
    namespace SerTest
    {
        class Ser
        {
            public static byte[] Serialize<T>(T Data)// where T : class
            {
                BinaryFormatter formatter = new BinaryFormatter();
                using (MemoryStream stream = new MemoryStream()) 
                {
                    formatter.Serialize(stream, Data);
                    return stream.GetBuffer();
                }
            }
    
            public static T Deserialize<T>(byte[] data)// where T : class
            {
    
                BinaryFormatter formatter = new BinaryFormatter();
                using (MemoryStream fstream = new MemoryStream(data))
                    return (T)formatter.Deserialize(fstream);
            }
        }
    
        [Serializable]
        class MyDumbTestClass
        {
            int i;
            string s;
    
            public MyDumbTestClass(int i, string s)
            {
                this.i = i;
                this.s = s;
            }
    
            public override string ToString()
            {
                return s + " " + i;
            }
        }
    
        class Program
        {
    
            static void Main(string[] args)
            {
                MyDumbTestClass m1 = new MyDumbTestClass(23, "Hallo");
                Console.WriteLine(m1.ToString());
    
                byte[] bytes = Ser.Serialize(m1);
                MyDumbTestClass m2 = Ser.Deserialize<MyDumbTestClass>(bytes);
                Console.WriteLine(m2.ToString());
    
                Console.ReadKey(true);
                return;
    		}
    	}
    }
    


  • µ schrieb:

    ...

    Erstmal danke für die Wahnsinns Antwort! Ich hab die Klasse "Ser" aus deinem Beispiel, und das Äquivalent zu MyDumbTestClass, welche bei mir valist heißt, in eine DLL gepackt (heißt 1stclasslib.dll), da ich ja beides sowohl auf dem Client und dem Server brauche, und die DLL in die Programme eingebunden. Das Serialisieren klappt anscheinend auch problemlos.
    Auf Clientseite hab ich nun aber folgendes Problem:
    Bei Code

    byte[] buffer = client.receive();
                valist vas = Ser.Deserialize<valist>(buffer);
    

    Erhalte ich den Fehler:

    Das Objekt des Typs "System.Collections.Generic.List`1[_1stclasslib.valist]" kann nicht in Typ "_1stclasslib.valist" umgewandelt werden.
    

    Wenn ich im Code

    List<valist> vas = Ser.Deserialize<valist>(buffer);
    

    versuche, zeigt mir schon die Fehlerliste, das eine Umwandlung nicht möglich sei ....

    Habt ihr auch hier noch die Lösung für mich bitte?



  • Wenn Du ein List<valist> serialisierst, muss

    List<valist> vas = Ser.Deserialize<valist>(buffer);

    wie folgt aussehen:

    List<valist> vas = Ser.Deserialize<List<valist>>(buffer);

    Immer genau auf den Typ achten.



  • µ schrieb:

    Wenn Du ein List<valist> serialisierst, muss

    List<valist> vas = Ser.Deserialize<valist>(buffer);

    wie folgt aussehen:

    List<valist> vas = Ser.Deserialize<List<valist>>(buffer);

    Immer genau auf den Typ achten.

    Perfekt, danke!


Log in to reply