# Was ist damit gemeint?



## animo (1. Mai 2012)

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!


----------



## Marco13 (1. Mai 2012)

Ich würde mal auf eine zweite Klasse mit einer "main" drin tippen....


----------



## Final_Striker (1. Mai 2012)

animo hat gesagt.:


> Ich habe diese vier Punkte in meinem Hauptprogramm schon abgehackt und ich verstehe gar nicht warum ich so etwas brauche.



Da wirst du wohl deinen Lehrer/Professor oder wenn auch immer fragen müssen. ;-)


----------



## animo (1. Mai 2012)

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


----------



## Gast2 (1. Mai 2012)

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


----------



## animo (1. Mai 2012)

Final_Striker hat gesagt.:


> Da wirst du wohl deinen Lehrer/Professor oder wenn auch immer fragen müssen. ;-)



frage ich auf jeden Fall,aber ich will heute noch bisschen programmieren!


----------



## irgendjemand (1. Mai 2012)

@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 (1. Mai 2012)

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


```
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 :

```
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 (1. Mai 2012)

Fehlermeldung :

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


----------



## irgendjemand (1. Mai 2012)

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 (2. Mai 2012)

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.


----------



## JohannisderKaeufer (2. Mai 2012)

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.

```
List<Person> people:

ous.writeObject(people);
```
und dann beim einlesen


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

Oder du schreibst beim ersten mal die Anzahl der serialisierten Objekte in deine Datei

```
ous.writeInt(arr.size());

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


```
int size = ois.readInt()

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

Oder du fängst Exceptions



```
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 (2. Mai 2012)

Ich habe es so gelöst 


```
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!


----------

