Was ist damit gemeint?

animo

Mitglied
Moin.moin!

Ich habe in Programmieren so eine Aufgabe bekommen:
a) Vorbereitung
Definieren Sie ein neues Projekt und darin zwei Klassen Person und Adresse mit folgenden Attributen:
Person(String name, String, gJahr, Adresse adr) Adresse(String strasse, String hnr, String plz, String ort)
Erstellen Sie ein Hauptprogramm Loesung_ser_1.java, welches Angaben zu beliebigen Personen und deren Adressen zeilenweise übernimmt. Um sich Mehrfacheingaben zu ersparen, lesen Sie die Werte aus einer Datei ein. Diese Datei sollten Sie mit Zeilen belegen wie:
“Monika Mustermann,1999,Hauptstr.,12a,70000,Stuttgart“
Erzeugen Sie aus den Personenangaben jeweils neue Instanzen der beiden Klassen und tragen sie diese Instanzen in eine ArrayList<Person> ein.
Programmierung II - SS 2012
b) Serialisierung
Schreiben Sie anschließend die Inhalte der ArrayList<Person> mit den Standardmechanismen zur Serialisierung in eine Datei personen.ser.
c) Deserialisierung
Schreiben Sie ein zweites Hauptprogramm Loesung_ser_2.java, mit dem Sie die Objektdaten aus der Datei personen.ser wieder in eine ArrayList<Person> einlesen.

a,b,c habe ich schon fertig und d hab ich auch. Die frage ist die : Was ist gemeint mit zweitem Hauptprogramm?
Ich habe diese vier Punkte in meinem Hauptprogramm schon abgehackt und ich verstehe gar nicht warum ich so etwas brauche.
Vielen Dank im Voraus!
 

animo

Mitglied
das war auch mein erster Gedanke,aber ich habe keine Ahnung wie es gehen soll. Welches main wird dann zuerst aufgerufen?
 
G

Gast2

Gast
Es wird immer nur genau eine main Methode beim starten der JVM aufgerufen. Die gibst du beim starten an.
 

irgendjemand

Top Contributor
@TO
du sollst insgesamt 4 klassen schreiben

Person
Adresse
LoesungSer1.java
LoesungSer2.java

*der name "Loesung_ser_1.java" entspricht einfach mal überhaupt nicht den conventions ... alleine das dir so ne aufgabe gestellt wird zeigt das der lehrer ziemlich inkompetent ist*

und in den beiden lösungs-klassen jeweils ne main ... die erste erstellt n paar objekt .. kracht die in ne ArrayList und schreibt diese serialisiert in ne datei .. und die zweite soll die halt wieder einlesen und vermutlich ausgeben
 

animo

Mitglied
Jetzt bin ich echt verwirrt. Jetzt kann ich nicht die Datei deserialisieren.
Hier geht es :

Java:
FileOutputStream fos = new FileOutputStream("C:\\Users\\Iegor\\Desktop\\person.ser");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			for (int i = 0; i < arr.size(); i++) {
				oos.writeObject(arr.get(i));
			}
			oos.flush();
			oos.close();

			ArrayList<Person> a = new ArrayList<Person>();
			FileInputStream fis = new FileInputStream("C:\\Users\\Iegor\\Desktop\\person.ser");
			ObjectInputStream ois = new ObjectInputStream(fis);
			for (int i = 0; i < arr.size(); i++) {
				Person p = (Person) ois.readObject();
				a.add(p);
			}

			for (int i = 0; i < a.size(); i++) {
				System.out.println("Die Daten aus person.ser" + a.get(i));
			}

			ois.close();


Aber hier nicht mehr :
Java:
public static void main(String[] args) throws IOException,
			ClassNotFoundException {
		ArrayList<Person> a = new ArrayList<Person>();
		
		
		FileInputStream fis = new FileInputStream(
				"C:\\Users\\Iegor\\Desktop\\person.ser");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Object object = ois.readObject();
		Person p = null;
		while( object != null){
//			p = (Person) ois.readObject();
			a.add((Person)object);
			object = ois.readObject();
		}
		
		for (int i = 0; i < a.size(); i++) {
			System.out.println("Array2" + a.get(i));
		}
	}


Vielleicht sehe ich nicht mehr richtig was da passiert?
 

animo

Mitglied
Fehlermeldung :

Exception in thread "main" java.io.EOFException
at java.io_ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io_ObjectInputStream.readObject0(Unknown Source)
at java.io_ObjectInputStream.readObject(Unknown Source)
at Loesung_ser_2.main(Loesung_ser_2.java:32)
 

irgendjemand

Top Contributor
schreib doch einfach die ganze liste als ein objekt in den stream anstatt die einzelnen objekte die diese enthält

google : "java ist auch eine insel serialisierung" ...

das sind echt grundlagen ...

[ot]wie ich immer wieder sage : ich kann mir nur sehr schwer vorstellen das jemanden solche aufgaben gestellt werden OHNE das vorher nötige grundlagen vermittelt wurden ...
mal selbst hirn anstellen und nachdenken und dann vllt noch google nutzen sollte man schon mal auf die reihe bekommen wenn man es sich selbst aussucht in einen informatik-kurs/-studium zu gehen ...
wenn man dann nichts rafft hat man eindeutig bei der entscheidung das überhaupt anzufangen was falsch gemacht[/ot]
 

animo

Mitglied
In dieses Buch "Java ist auch eine Insel" schaue ich relativ oft,aber leider es ist nicht immer genug,um die Sachen zu verstehen.

Vielen Dank für die Hilfe.
 
J

JohannisderKaeufer

Gast
Das Problem, das du bekommst liegt darin, dass du, nachdem du die letzte Person aus deiner Datei gelesen hast, versuchst eine weitere Person zu lesen.

In dem Beispiel in dem es funktioniert, nutzt du beim einlesen in der for-schleife arr.size() um nicht "zuviele" Objekte einzulesen.

Eine Möglichkeit ist, wie bereits gesagt, alle Personen auf einmal zu schreiben.
Java:
List<Person> people:

ous.writeObject(people);
und dann beim einlesen

Java:
List<Person> people = ois.readObject();

Oder du schreibst beim ersten mal die Anzahl der serialisierten Objekte in deine Datei
Java:
ous.writeInt(arr.size());

for(int i =0;i<arr.size();i++)
ous.wirte(arr.get(i));
und liest

Java:
int size = ois.readInt()

for(int i = 0;i<size;i++)
Person p = (Person) ois.readObject();

Oder du fängst Exceptions


Java:
try{
while( object != null){
//          p = (Person) ois.readObject();
            a.add((Person)object);
            object = ois.readObject();
        }
}catch(IOException e){
System.out.println("Dateiende erreicht");
}

=> letzteres ehrer ein NO-GO, wenn der Kollege serialisiert hat wie du und man wieder an die Daten ran muß, weil halt was wichtiges drinsteht in den Dateien, dann ist das eine valide Lösung um nicht gefeuert zu werden.
 

animo

Mitglied
Ich habe es so gelöst

Java:
try {
			FileInputStream fis = new FileInputStream("person.ser");
			ObjectInputStream ois = new ObjectInputStream(fis);
			ArrayList<Person> eee = (ArrayList<Person>) ois.readObject();
			
			
			for (int i = 0; i < eee.size(); i++) {
				System.out.println(eee.get(i));
			}
			ois.close();
		
		
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


Ich habe es auch verstanden,dass ich eine Person zu lesen versuche,die nicht existiert. Bin halt nicht auf die Idee gekommen,den ganzen Spaß woanders zu speichern. Fehlende Praktik in Programmieren(((

Vielen,vielen Dank!
 

Neue Themen


Oben