PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : java: serializable user data


AHF
2003-10-09, 20:44:54
grüße,

ich möchte zwei felder von string[] und einen string zu einem serializable object zusammenfassen. auf alle variablen möchte ich lesend und schreibend zugreifen können und sie sollen sortiert sein, dass ich sie direkt über indices anspechen kann. am besten sowas wie das von c/c++ bekannte strukt.

pseudo-code:

static(?) class(?) UserData implements Serializable
{
String[] s1 = new String[]{"1","2"};
String[] s2 = new String[]{"3","4"};
String s3 = new String {"test"};

String[] getString();
void setString (String[] s);
}


wie mach ich das am dümmsten? eine klasse schreiben, die serializable implementiert oder ein interface davon ableiten und das implementieren? wie siehts mit methoden aus, sind die vorgegeben oder muss ich die selbst definieren?

danke im voraus.

HellHorse
2003-10-09, 21:17:00
Hmm, wenn du eine Klasse serialisierten willst, muss sie Serializable implementieren. Alle Felder die nicht static oder transient sind, werden dann automatisch serialisiert. Wenn etwas spezielles bei der Serialisation/Deserialisation geschen soll (z.B. transiente oder static Felder initialisiern) musst du zusätzlich writeObjet(ObjectOutputStream out) und readObject(ObjectInputStream in) implementieren.

Aber irgendwie sehe ich nicht ganz, was du willst.

AHF
2003-10-09, 21:37:05
ich möchte zur laufzeit des programms auf die strings zu greifen können, d.h. schreibend und lesend. dann sollen sie (als bestandteil in einem anderen objekt) in eine datei geschrieben werden, also die werte eingefroren. dann möchte ich die datei wieder laden, um an die werte ranzukommen und zu verarbeiten. bei der serialization soll an den feldern selbst nichts geändert werden.

HellHorse
2003-10-09, 22:03:13
IC

... laufzeit des programms auf die strings zu greifen können ...

Hmm, getter und setter?
...in eine datei geschrieben werden, also die werte eingefroren. dann möchte ich die datei wieder laden...
etwa so

public void store() throws IOException {
FileOutputStream fos = new FileOutputStream("foo.bar");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(this);
oos.flush();
oos.close();
}

public static UserData load() throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("foo.bar");
ObjectInputStream ois = new ObjectInputStream(fos);
UserData dataClass = (UserData) ois.writeObject();
ois.close();
return dataClass;
}

Falls du aber wirklich nur ein paar String in eine Datei speichern willst, nimmstu du am besten Properties (http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html). Das ist viel einfacher.

AHF
2003-10-09, 23:52:25
ja so ungefähr, optimalerweise sowas:

http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/javax/media/j3d/SceneGraphObject.html#setUserData(java.lang.Object)

heißt: (alles in pseudocode)

speichern:
// die serialisierten daten sind zum obekt hinzugefügt
UserData u = new UserData(); // serializable data
Object o = new Object(args, u); // container
File file = new File("file.out");
FileWriter writer = new FileWriter(file);
writer.write(o);
writer.close();

laden:
File file = new File("file.out");
FileReader reader = new FileReader(file);
Object o = reader.getObject();
reader.close();

arbeiten mit o:
o.get();
o.set();

arbeiten mit u:
o.getUserData().get();
o.getUserData().set();

heißt o hat x methoden und variablen, wovon u eine vom typ UserData ist. die frage ist, ob ich die blauen methoden implementieren soll/kann/muss. u sind sozusagen kategorisierte metadaten, die o genauer beschreiben.

alternativ geht auch:
UserData u = new UserData();
Object o = new Object();
writer.write(o,u);

hat allerdings den nachteil, dass ich nur ein o pro file speichern kann...

die frage ist jetzt: wie baue ich UserData am besten auf? collection? list? klasse?

HellHorse
2003-10-11, 13:57:54
IC
Die Frage ist also weniger, wie man serialisiert, sondern wie UserData aussehen soll.
Um dir dazu eine gescheite Antwort zu geben, habe ich leider zu wenig Information wo und wie du es verwendest.
Bis jetzt tönt es ja ähnlich wie BeanInfo (http://java.sun.com/j2se/1.4.2/docs/api/java/beans/BeanInfo.html).

AHF
2003-10-11, 22:26:57
ja, so ist es. das de/serialisieren wird vom filereader/writer übernommen. voraussetzung ist allerdings, dass UserData überhaupt serializable ist.

ich versuch mal zu erklären, was ich machen will:

object o ist eine klasse mit variablen und ihren zugehörigen set/get-methoden. zusätzlich hat sie ein feld für userdata plus die zugehörigen set/get-methoden.

nun instanziiere ich o und setze per konstruktor alles auf seine default-werte.

setze ich zum beispiel mit o.setUserData(String s) einen string ins UserData feld, bekomme ich diesen mit get auch wieder zurück. soweit so gut, nun möchte ich allerdings nicht nur einen string speichern, sondern mehrere verschiedene daten. ich könnte diese irgendwie gruppieren (keine ahnung, wie...)

getUserData() würde mir dann aber immer alles zurückliefern. also müsste ich methoden zum lesen und schreiben der einzelnen werte implementieren. allerdings muss die ganze klasse mit methoden und werden serializable sein, sonst meckert der filewriter.

kurz:

ich erstelle ein neues o
ich möchte mit o arbeiten, also auch UserData lesen und schreiben
ich möchte o in einer datei speichern können
ich möchte o laden können und auf UserData wieder zugriff haben

die frage ist nun, wie baue ich UserData auf, damit ich 1)mehrere verschiedene werte darin speichern kann, 2)auf diese werte lesend und schreibend zugreifen kann und zwar einzeln und 3)das ganze serializable-konform halte, damit der filewriter zufrieden ist.

edit: ach ja – o extends com.sun.j3d.utils.geometry.Primitive

leider gibts da keinen online-link dafür.

HellHorse
2003-10-12, 16:57:45
Das ganze geht schon in Richtung JavaBeas, properties und Accessoren dafür. Schaust es dir am besten mal an, so als Denkanstoss.
Maximale Flexibilität erreichst du wohl, wenn du intern mit einer Map arbeitest. Da kannst du z.B ein String (property Name) als Key und das Objekt selbst als Wert verwenden. Da eigentlich alle Klassen vom Collection Framework Serializable implementieren, sollte das kein Problem sein.

Du musst dir aber überlegen, wo das mit der Flexibilität aufhören soll. Denn schlussendlich willst du ja noch was damit anfangen (hoffentlich). Und bloss Object Referenzen rumschieben macht auf Dauer auch nicht glücklich.
Daher kann ich dir nur raten genau zu überlegen, wofür du das brauchst und was du damit anstellen willst.

AHF
2003-10-13, 19:28:59
so ich habs nun gelöst: eine eigene klasse UserData mit entsprechenden attributen und methoden erstellt, die serializable implementiert. eine instanz von UserData wird dann an o mit o.setUserData(new UserData(bla,bla,bla)) übergeben.

prinzipiell so ähnlich, wie ich es schon mal hatte, nur dass es diesmal funktioniert, weil ich serializable implementiert habe. :)

trotzdem danke für die hilfe.