Serialisierung selber schreiben

ruNN0r

Erfahrenes Mitglied
Hallo,
wir sollen als Lehraufgabe eine Serialisierung selber schreiben. Dazu haben wir eine Klasse:
Code:
public class PersonenDaten {
    public String personenname = "";
    public Date geburtsdatum = new Date();
    public long zahl = 468435;
   
    public byte[] toByteArray()
    {
    }
}

meine Kenntnisse in Java sind nicht besonders gut. Aber unser Prof. zwingt uns, Java zu nutzen und es bis morgen vorzulegen. Ich komm jedoch auf keinen grünen zweig dabei.

Wie schaffe ich es nun die länge eines Obj. wie z.B. String, Date, int zu erfassen und jedes einzelne Byte des Speichers in ein ByteArray zu schreiben?

Ich danke euch.
 
Hallo ruNN0r

Da gibt es grundsätzlich viele Möglichkeiten. Du kannst z.B. die Klasse in einen XML-String serialisieren und dann den als byte array zurückgeben. Oder aber du erstellst wirklich eine binäre Repräsentation deiner Klasse. Schlussendlich gibts natürlich auch schon vorgefertigte Klassen in Java für die Serialisierung von Objekten, aber das ist wohl nicht die Idee. Hier ein Beispiel binärer Repräsentation:

Java:
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Date;

public class Person {
    static final Charset CHARSET = Charset.forName("UTF-8");

    public String name = "";
    public Date birthDay = new Date();
    public long number = 468435;

    public Person() {

    }

    public Person(byte[] data) {
        ByteBuffer buffer = ByteBuffer.wrap(data);
        int strLength = buffer.getInt();
        byte[] strBytes = new byte[strLength];
        buffer.get(strBytes);

        this.name = new String(strBytes, CHARSET);
        long dateValue = buffer.getLong();
        this.birthDay = new Date(dateValue);
        this.number = buffer.getLong();
    }

    public byte[] toByteArray() {
        byte[] values = this.name.getBytes(CHARSET);
        long dateValue = this.birthDay.getTime();

        ByteBuffer buffer = ByteBuffer.allocate((Integer.SIZE + Long.SIZE * 2) / 8 + values.length);
        buffer.putInt(values.length);
        buffer.put(values);
        buffer.putLong(dateValue);
        buffer.putLong(this.number);

        return buffer.array();
    }

    @Override
    public String toString() {
        return this.name + " - " + this.birthDay.toString() + " - " + this.number;
    }

    public static void main(String[] args) {
        Person p = new Person();
        p.name = "Cromon";
        p.number = 43512;

        byte[] serialized = p.toByteArray();
        Person p2 = new Person(serialized);

        System.out.println(p2);
    }
}
 
Klasse! Vielen Dank. Ich hatte nun nicht erwartet einen ganzen Quelltext zu bekommen. Ein paar schnippsel zum Gehirnschmalz weich klopfen hätten auch gereicht ;) Aber das ist schon sehr geil. Ich habe es auch verstanden denke ich.

Ja, serialisierung kenne ich generell. Wie es in anderen Programmiersprachen geht weiß ich auch. Nutze ich auch. Aber Java ist für mich irgendwie nichts. Naja und wenn man nicht gerade marshalling programmiert braucht man sich die Serialisierung auch nicht selber schreiben ^^

Ich danke dir vielmals. Du hast mir sehr geholfen. Nun muss ich noch herrausfinden wie ich einen unsigned 32bit integer in java erschaffe^^
 
Zurück