Serialisieren von mehreren Objekten

Status
Nicht offen für weitere Antworten.

balu2000

Mitglied
Hallo Zusammen!

Ich habe folgendes Problem:

ich möchte mehrere Objekte serialisieren und in einer Datei speichern, um sie später wieder auslesen zu können.

Jedes Objekt hat als Attribut eine eindeutige ID, anhand welcher ich später wieder auf die einzelnen Objekte zugreifen möchte.

Standardmäßig geht das folgendermaßen:
Code:
package se;

import se.Student;
import java.io.*;
import java.util.Date;

public class StudentenVerwaltung{

	private static Student student = new Student();
	
	
	public static void studentAnlegen(int matNr, String vor, String nach){

		student.setMatrikelnummer(matNr);
		student.setVorname(vor);
		student.setNachname(nach);
	}

	public static void main(String args[]) throws IOException, ClassNotFoundException{
		
		studentAnlegen(1,"Max","Mustermann");
		studentAnlegen(2,"Hans","Wurst");
		studentAnlegen(3,"Herr","Gesangsverein");
		
		FileOutputStream fos = new FileOutputStream("t.tmp");
		ObjectOutputStream oos = new ObjectOutputStream(fos);

		oos.writeObject(student);

		oos.close();
		
		FileInputStream fis = new FileInputStream("t.tmp");
		ObjectInputStream ois = new ObjectInputStream(fis);

		Student student = (Student) ois.readObject();

		ois.close();
		
		System.out.println(student.nachname);
		
	}

	
	
}

Das Problem ist folgendes: jeder Aufruf der Methode "studentAnlegen() überschreibt das zuletzt geschriebene Objekt in der Datei.
Wie kann ich es erreichen, dass alle Objekte persistent werden und über das Attribut "matrikelnummer" wieder aufgerufen werden können?

Danke für die Hilfe!
 
S

SlaterB

Gast
1.
eine statische Variable durch irgendwelche versteckten Hilfsoperationen zu ändern und irgendwo im Programm an richtiger Stelle zu verwenden ist von Grund auf schlecht,

wenn du drei Studenten mit 3 Namen hast, dann erstelle dir doch bitte 3 Studenten-Objekte, und schon sind derartige Probleme undenkbar

2.
> jeder Aufruf der Methode studentAnlegen() überschreibt
du hast eh nur einen Aufruf (innerhalb eines Programmablaufs), da kann man also nicht wirklich von überschreiben reden,
wenn du 3x speichern willst, dann rufe auch 3x speichern auf (an der richtigen Stelle)


3.
allerdings ist es korrekt, dass z.B. bei jeder neuen Programm-Ausführung die alte Datei gnadenlos überschrieben wird,
es ist auch durch andere Kommandos nicht trivial möglich, die Datei zu öffnen und einen weiteren Studenten anzufügen,

denkbar wäre höchstens, in eine Datei in einem Rutsch alle drei Studenen zu schreiben
(bisher hst du nur 1x schreiben und auch nur 1x lesen)

4.
> Wie kann ich es erreichen, dass alle Objekte [..] über das Attribut "matrikelnummer" wieder aufgerufen werden können?

zaubern kann die Serialisierung von alleine nicht, du kannst nur die Objekte in der Reihenfolge, wie sie geschrieben wurden, wieder einlesen,
wenn du danach einen Index nach der Matrikelnummer oder ähnliches aufbauen willst, dann tue dies,
mit Serialisierung hat dies aber direkt nichts zu tun
 

Wildcard

Top Contributor
SlaterB hat gesagt.:
allerdings ist es korrekt, dass z.B. bei jeder neuen Programm-Ausführung die alte Datei gnadenlos überschrieben wird,
es ist auch durch andere Kommandos nicht trivial möglich, die Datei zu öffnen und einen weiteren Studenten anzufügen,
Wie meinen? :shock:
http://java.sun.com/javase/6/docs/api/java/io/FileOutputStream.html#FileOutputStream(java.io.File,%20boolean)
 
S

SlaterB

Gast
jo, das hatte ich in einem anderen Topic auch mal zuerst geantwortet,
ObjektOutputStream schreibt aber besondere Markierungen
BeginToken, NextObjectToken, EndOfFileToken,
und da gibt es keine Möglichkeit, zwei Dateien zusammenzumergen oder eine alte Datei aufzubrechen

zumindest habe ich auf die Schnelle nix gesehen,
wenn man bös das letzte Token manuell wegradiert, wirds bestimmt irgendwie gehen ;) ,
mit append allein ist es jedenfalls nicht getan
 

Wildcard

Top Contributor
Das Ding schreibt EOF? :autsch:
Ein Grund mehr warum Serialisierung kein Ersatz für reguläre Persistierung ist.
 

balu2000

Mitglied
Sorry für die offensichtlichen Fehler, aber ich bin leider ein Anfänger...

Im Endeffekt soll die Serialisierung die Persistenzschicht übernehmen.
D.h. das Programm soll Studenten aufnehmen und löschen können.

Da neue Objekte nicht an eine bestehende Datei angefügt werden können, wird es ausreichen alle vorhandenen Objekte zum Programmstart auszulesen und beim beenden zu serialisieren und in die Datei zu schreiben.

Allerdings weiss ich immer noch nicht, wie ich mehrere Objekte in eine Datei schreiben kann bzw. aus einer Datei auslesen kann.

Ich kann ja nicht einfach eine statische Anzahl von Objekten erstellen, mit jeweils einer "write"-Methode, da ich nicht im voraus weiß wieviele Daten während einer Session eingepflegt werden...

EDIT:

habe selber eine vorläufige Lösung gefunden, indem ich einen AttributsVektor statt einzelner Attribute speichere und abrufe.
 
S

SlaterB

Gast
du speicherst doch nicht etwa mehrere Namen in einem Studenten?
erstelle dir lieber mehrere Studenten-Objekte mit jeweils einem Namen,

mehrfaches Schreiben und Lesen: mehrfach read/ write aufrufen
 

balu2000

Mitglied
Ich mache es folgendermaßen:

Code:
package se;

import se.Student;
import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Vector;

public class StudentenVerwaltung implements Serializable{

	Vector list = new Vector();
	String fileName;
	
	public StudentenVerwaltung(String file){
		fileName = file;
	}
	
	public void addStudent(Student student){
		list.addElement(student);
	}
	
	public String toString(){
		return list.toString();
	}
	
	public void save() throws IOException{
		OutputStream outFile = new FileOutputStream(fileName);
		ObjectOutputStream outObj = new ObjectOutputStream(outFile);
		outObj.writeObject(this);
		outObj.close();
	}
	
	public static StudentenVerwaltung fromFile(String studentFile) throws OptionalDataException, ClassNotFoundException, IOException{
		InputStream inFile = new FileInputStream(studentFile);
		ObjectInputStream inObj = new ObjectInputStream(inFile);
		
		StudentenVerwaltung recovered = (StudentenVerwaltung) inObj.readObject();
		
		inObj.close();
		return recovered;
	}
	
	
	
	public static void main(String args[]) throws IOException, ClassNotFoundException{
		
		StudentenVerwaltung v = new StudentenVerwaltung("studenten.dat");
		v.addStudent(new Student(1,"Max","Mustermann"));
		v.addStudent(new Student(2,"Hans","Wurst"));
		v.addStudent(new Student(3,"Herr","Gesangsverein"));
		System.out.println(v);
		
		v.save();
		
		StudentenVerwaltung recoveredClass = StudentenVerwaltung.fromFile("studenten.dat");
		System.out.println(recoveredClass);
		System.out.println(recoveredClass.list.get(0));
	}

	
	
}

Das funktioniert so weit ganz gut.

Allerdings weiß ich nicht, wie ich nun auf einzelne Attribute (also z.b. der Nachname von dem Studenten mit Index = 1 in dem Vektor) zugreife und nicht immer alle 3 Attribute ausgegeben werden.

Die Klasse "Vector" bietet da scheinbar keine Methode für, würde das mit einer Collection oder etwas ähnlichem gehen?

PS: Danke für die bisherige Hilfe. Das hat mich deutlich weitergebracht ;)

EDIT: hab meinen Fehler gefunden. In der Klasse "Student" habe ich die Attribute in Strings umgewandelt, das war natürlich Quatsch.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
D Problem mit Referenzen beim Serialisieren Allgemeine Java-Themen 3
J Methoden Fehler beim serialisieren und laden!? help Allgemeine Java-Themen 4
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
J Bilddaten serialisieren Allgemeine Java-Themen 7
B Zertifikat des Users speichern (serialisieren oder kopieren) Allgemeine Java-Themen 2
A Dateien Serialisieren Allgemeine Java-Themen 50
G Objekte serialisieren Allgemeine Java-Themen 2
MQue Serialisieren von Objecten Allgemeine Java-Themen 6
J Ein Objekt mehrfach serialisieren Allgemeine Java-Themen 2
A Problem beim serialisieren/deserialisieren einer ArrayList Allgemeine Java-Themen 3
M Observer serialisieren Allgemeine Java-Themen 7
K Collections oder Vektoren sicher zu serialisieren? Allgemeine Java-Themen 5
M DefaultTableModel wirft beim Serialisieren Exception :-( Allgemeine Java-Themen 7
Z Array serialisieren Allgemeine Java-Themen 4
G Serialisieren eines JButton mit Icon Allgemeine Java-Themen 8
F Textformatierungen wie serialisieren? Allgemeine Java-Themen 5
L unterschiedliche Größe beim serialisieren eines Objektes! Allgemeine Java-Themen 6
G Serialisieren von Objekten : IO Exception beim Schreiben Allgemeine Java-Themen 3
R Serialisieren Allgemeine Java-Themen 2
F Bild (File) komplett serialisieren Allgemeine Java-Themen 9
B Serialisieren von Klassen Allgemeine Java-Themen 4
thE_29 Serialisieren von AWTEvent Allgemeine Java-Themen 19
I Vector serialisieren: StackOverflow Allgemeine Java-Themen 13
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
P Projekte entwickeln mit mehreren Personen Allgemeine Java-Themen 1
C Aus MEHREREN Excel Tabellen bestimmte Zelle addieren Allgemeine Java-Themen 1
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
M JavaFX Button mit mehreren Aktionen? Allgemeine Java-Themen 7
J Soap Client mit mehreren URLs in Servlets Allgemeine Java-Themen 0
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
I Anwendung auf Netzlaufwerk von mehreren Usern gleichzeitig nutzbar. Allgemeine Java-Themen 3
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
perlenfischer1984 Testng : Funktion mit mehreren Parametern testen Allgemeine Java-Themen 5
I Methoden Schnelle Hilfe benötigt - Kleines Video/Slideshow aus mehreren Bildern erstellen Allgemeine Java-Themen 3
F JScrollPane mit mehreren Panels Allgemeine Java-Themen 1
S Text in mehreren Sprachen korrekt darstellen? Wie waehle ich die Fonts aus..? Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
AssELAss String mit mehreren Zahlungsbeträgen formatieren Allgemeine Java-Themen 10
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
7 Verbinden von Mehreren Klassen Allgemeine Java-Themen 29
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
J Projekt mit mehreren Einzelprogrammen Allgemeine Java-Themen 2
K Laufzeitermittlung an PCs mit mehreren Prozessorkernen Allgemeine Java-Themen 5
Jats Hilfe bei Bank mit mehreren Klassen Allgemeine Java-Themen 11
D Von mehreren Objekten eine Eigenschaft abfragen Allgemeine Java-Themen 11
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
S Objekt synchronisieren, sodass es nicht von mehreren Threads benutzt wird..? Allgemeine Java-Themen 2
L Zugriff auf ein Objekt mit mehreren Threads Allgemeine Java-Themen 11
L Warten bei mehreren Threads, bis Ende erreicht ist Allgemeine Java-Themen 2
D JTabel sortieren nach mehreren kriterien Allgemeine Java-Themen 3
K System.exec() Programm mit mehreren Parametern Allgemeine Java-Themen 8
V aus mehreren jar files, ein großes basteln Allgemeine Java-Themen 22
H wait() and notify() mit mehreren Prozessen Allgemeine Java-Themen 14
W Map / Tupel aus mehreren Elementen? Allgemeine Java-Themen 8
V javadoc mergen / aus mehreren eclipse plugins ein javadoc Allgemeine Java-Themen 3
E Aus mehreren PDFs eines machen, zusammenfügen mittels iText Allgemeine Java-Themen 1
reibi Classenpath mit mehreren gleichen jar-Files Allgemeine Java-Themen 7
M Die gleiche Klasse in mehreren JAR files Allgemeine Java-Themen 5
T Problem mit mehreren Fenstern Allgemeine Java-Themen 2
P HashMap mit mehreren gleichen keys Allgemeine Java-Themen 4
E focus problem (mit mehreren frames) Allgemeine Java-Themen 10
C Auswahl einer Version, bei mehreren installierten Versionen Allgemeine Java-Themen 3
O System.nanoTime() einheitlichen Wert auf mehreren Rechnern? Allgemeine Java-Themen 9
S ArrayList nach mehreren Spalten sortieren? Allgemeine Java-Themen 13
D Werte aus mehreren getMethoden auslesen Allgemeine Java-Themen 2
S Vererbung von mehreren Klassen? Allgemeine Java-Themen 5
M Alle möglichen Kombinationen von mehreren Objekten berechnen Allgemeine Java-Themen 6
B Aus mehreren Fenstern(Dialogen) eins machen! Allgemeine Java-Themen 2
C Map(Key/Value) mit mehreren Values Allgemeine Java-Themen 16
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
B Sent and Receive Funktionen zwischen Objekten ermöglichen? Allgemeine Java-Themen 8
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
PCOmega137 Objekten zufällig erzeugte Namen geben Allgemeine Java-Themen 2
T Speichern von Objekten Allgemeine Java-Themen 2
D Serialisierung und Deserialisierung von Objekten - Frageprogramm Allgemeine Java-Themen 4
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
M loeschen von objekten Allgemeine Java-Themen 22
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
K Vergleich von Strings von Objekten Allgemeine Java-Themen 4
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
D Verwaltung von sehr vielen Objekten Allgemeine Java-Themen 12
G problem: array aus objekten Allgemeine Java-Themen 10
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
B OOP Auf Zustandsänderungen von Objekten reagieren Allgemeine Java-Themen 2
H Best Practice zu vielen konstanten Objekten? Allgemeine Java-Themen 10
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3
P J-Unit vergleich von 2 Objekten merkwürdig Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben