jedes Objekt als Byte[] darstellen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Wincrash.

    jedes Objekt als Byte[] darstellen

    Hi Leute,

    ist es möglich jedes Objekt (egal von welchem Typ) in ein Byte-Array zu konvertieren - und wieder zurück?
    Ich habe da einige Lösungsansätze gefunden, jedoch erfordern diese das <serializable>-Attribut...

    Kann mir da jemand helfen?
    Vielen Dank,
    wincrash
    (\_/) Das ist Hase.
    (O.o) Kopiere Hase in deine Signatur
    (> <) und hilf ihm so auf seinem Weg zur Weltherrschaft.
    Nur ne Idee: Schau Dir mal die BitConverter-Klasse an und probier dann bisschen rum.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Prinzipell keine schlechte Idee - jedoch scheint das nur Zahlen o. Boolean --> Array oder für Array --> Zahl/Boolean zu funktionieren
    Das Problem ist, dass ich auch komplexe Klassen oder Strukturen in ein Bytearray konvertiren muss

    Grüße,
    wincrash

    EDIT: oder wie kann ich jedes beliebige Objekt in einen Stream konvertieren, damit ich dann aus dem Stream das Byte-Array bekomme?
    (\_/) Das ist Hase.
    (O.o) Kopiere Hase in deine Signatur
    (> <) und hilf ihm so auf seinem Weg zur Weltherrschaft.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Wincrash“ ()

    Wincrash schrieb:

    komplexe Klassen oder Strukturen
    Strukturen kannst Du elementweise konvertieren, für komplexe Klassen bietet sich das Serialisieren an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke @RodFromGermany, jedoch habe ich einige Klassen, die nicht das <serializable>-Attribut besitzen - diese müssen aber auch konvertiert werden...

    Grüße,
    wincrash
    (\_/) Das ist Hase.
    (O.o) Kopiere Hase in deine Signatur
    (> <) und hilf ihm so auf seinem Weg zur Weltherrschaft.

    Wincrash schrieb:

    diese müssen aber auch konvertiert werden...
    Warum? Für wen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @EiPott @Wincrash
    Auf Structuren kann man in C# im unsave Code direkt per Cast auc byte* zugreifen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Man kann zwar mal kurz den Zeiger nehmen und die Bytes aus dem Speicher lesen, aber sowas ist nicht wiederherstellbar. Gucke msdn.microsoft.com/en-us/library/75dwhxf7.aspx

    Edit/
    Eine kleine Änderung: Theoretisch kann man auch stumpf die Bytes wieder iwo in den Speicher laden und die Klasse benutzen, dass geht. In nativen Sprachen klappt's auch praktisch (grade getestet), nur ob das auch in .Net geht weiß ich nicht. Ich betweifle auch, dass man sowas braucht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()

    hm... ok - vielen Dank für eure Antworten -
    Ich muss mich wohl dann auf strukturen beschränken

    Vielen Dank,
    wincrash

    EDIT:
    Wobei:

    ErfinderDesRades schrieb:

    Nein. Wie etwa willst du einen Button in Byte() umwandeln?

    Man kann doch mit IPC Klassen versenden u. empfangen - muss es da nicht auch eine Konvertierung in ein Byte-Array geben?
    (\_/) Das ist Hase.
    (O.o) Kopiere Hase in deine Signatur
    (> <) und hilf ihm so auf seinem Weg zur Weltherrschaft.
    Bei IPC werden wohl eher Datenpakete verschickt, die einen festen Aufbau haben. Also Strukturen.
    Sind das deine eigenen Klassen? Dann schreibe doch das Serializable-Attribut dran.
    Mit freundlichen Grüßen,
    Thunderbolt
    Was du mal versuchen könntest:
    1. Hohl dir den Zeiger einer Klasseninstanz
    2. Nimm ein Bytearray (so groß wie die Klasse)
    3. Schreib die Bytes der Klasse in's Array und caste das Array zu einem Zeiger der Klasse
    4. Testweise mal n paar Funktionen aufrufen und Properties durchgucken
    Falls das nicht geht versuch mal das ganze Zeug auf den unverwalteten Heap zu packen und dann natürlich selbst aufzuräumen. Geht bestimmt
    Hi
    alle Klassen und Strukturen, die serialisierbar sind, sind mit einem SerializableAttribute-Attribut zu versehen. D.h. wenn ein Typ dieses nicht hat, ist er auch nicht serialisierbar. Wenn der Typ dann die ISerializable-Schnittstelle implementiert, so wird auf GetObjectData und den geforderten Konstruktor zugegriffen.
    Auf Datenbasis zu programmieren ist in .Net nicht unbedingt üblich, außer es geht wirklich um Daten, denn es wurde eine Schicht zwischen Daten und Objekten eingeführt, die es prinzipiell nicht zu durchbrechen gilt. Serialisierung an sich ist halt genau das objektorientierte Konzept dafür, da alle Informationen sicher gespeichert werden können, ohne dass Information verloren geht oder falsch gespeichert wird.
    Man stelle sich btw. bspw. vor, dass es sich um ein Byte-Array handelt, das einen Zeiger repräsentiert. Das kann man nicht sinnvoll aus den Daten rausholen, bei der Serialisierung ist das möglich.

    Gruß
    ~blaze~