# Objekte Serialisiert speichern



## headnut (24. Jul 2012)

Hallo

Ich möchte eine eigene Arrayliste serialisiert speichern. Dies funktioniert auch wunderbar, jedoch nur beim ersten mal:


```
OutputStream fos;
		ObjectOutputStream o;

		// Auftrag sichern
		fos = new FileOutputStream(pfadDateiSer);

		o = new ObjectOutputStream(fos);

		// Liste serialisieren
		o.writeObject(verwArtikel.getListeAuftrag());
		//o.writeObject(zeit);

		o.close();
```


Beim zweiten speichern ist nur ein Eintrag mehr in der arraylist, jedoch kommt folgende Fehlermeldung:
Folgender Fehler wird hier geworfen:


```
o.writeObject(verwArtikel.getListeAuftrag());
```



```
java.io.NotSerializableException: com.sun.java.swing.plaf.windows.XPStyle$Skin
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:422)
	at javax.swing.table.JTableHeader.writeObject(JTableHeader.java:684)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
	at javax.swing.event.EventListenerList.writeObject(EventListenerList.java:240)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
```


----------



## nillehammer (24. Jul 2012)

Du versuchst offensichtlich, ein Objekt vom Typ 
	
	
	
	





```
com.sun.java.swing.plaf.windows.XPStyle$Skin
```
 zu serialisieren. Das ist nicht 
	
	
	
	





```
Serializable
```
. Wenn dieses Objekt in einer Instanzvariablen steckt, mache diese 
	
	
	
	





```
transient
```
. Ansonsten schaue, wo es herkommt (steckt es in der zu serialisierenden Liste?). Prinzipiell sollte es nicht nötig sein, GUI-Bestandteile zu serialisieren. Der Status einer GUI steckt im Model. Das muss serialisiert werden. Mit dessen Daten wird die GUI nach der Deserialisierung wieder aufgebaut.

Du kannst auch Generics nutzen, um sicherzustellen, dass in Deiner ArrayList nur Serializable-Instanzen landen:

```
ArrayList<? extends Serializable> serializables = new ArrayList<>();
```


----------



## headnut (24. Jul 2012)

Okey nun hab ich ein Verständnis Problem.

Ich habe nun mein look and feel auskommentiert, und nun gehts...

Dies hat jedoch nichts mit der Serialisierung zu tun, oder sehe ich dies falsch?


----------



## headnut (24. Jul 2012)

```
private List<List<Kapseln>> listeAuftrag = new ArrayList<List<Kapseln>>();
```

Diese Liste versuche ich zu speichern! Die hat aber absolut nichts mit der main zu tun, wo ich das look and feel setze...


----------



## faetzminator (24. Jul 2012)

Wie sieht die Klasse [c]Kapseln[/c] aus?


----------



## Michael... (24. Jul 2012)

Aber scheinbar wird versucht eine GUI Komponente (JTableHeader) zur serialisieren?


----------



## headnut (24. Jul 2012)

```
package verwKapseln;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import model.VerwArtikel;

public class Kapseln implements Serializable {
	
	private String daten;

	private VerwArtikel verwArtikel;

	private final double faktorMessung = 10000;

	private double[] messungen_1 = new double[6];
	private double[] messungen_2 = new double[6];

	private boolean[] auswertung_1 = new boolean[6];
	private boolean[] auswertung_2 = new boolean[6];

	private List<Double> messungRoyalBoden = new ArrayList<Double>();
	private List<Boolean> auswertungRoyalBoden = new ArrayList<Boolean>();

	/**
	 * Konstruktor fuer Apollo
	 * 
	 * @param daten
	 */
	public Kapseln(String daten, VerwArtikel verwArtikel, int anzRoyal) {
		this.daten = daten;
		this.verwArtikel = verwArtikel;

		if (verwArtikel.getTypKapsel().equals("Apollo")) {

			decodeDatenApollo();

			auswDatenApollo();

		} else if (verwArtikel.getTypKapsel().equals("Royal")) {
			decodeDatenRoyal(anzRoyal);

			// Erst nach der vierten Messung Die auswertung vornehmen
			if (anzRoyal >= 3) {
				auswDatenRoyal();
			}

		} else if (verwArtikel.getTypKapsel().equals("ATI")) {

			decodeDatenATI();

			auswDatenATI();

		}
	}

	/**
	 * Standart Konstruktor für Boden Royal
	 */
	public Kapseln(VerwArtikel verwArtikel) {
		this.verwArtikel = verwArtikel;
	}

	/**
	 * Decodiert die daten der Kapsel Apollo
	 */
	private void decodeDatenApollo() {

		StringBuilder sb = new StringBuilder(daten);

		int j = 0;
		int k = 0;

		for (int i = 0; i < daten.length(); i++) {
			// Trennzeichen suchen
			int trennzeichen = sb.indexOf(";");

			// Bei ende Daten Schleife beenden
			if (trennzeichen == -1) {
				break;
			}

			String s = sb.substring(0, trennzeichen);

			// Wert der messung
			if (j > 5) {
				messungen_2[k++] = Double.valueOf(Integer.valueOf(s)
						/ faktorMessung);

			} else {
				messungen_1[j++] = Double.valueOf(Integer.valueOf(s)
						/ faktorMessung);

			}
			sb = sb.delete(0, trennzeichen + 1);

			i = 0;
		}
	}

	/**
	 * Wertet die Daten der Kapsel Apollo aus
	 */
	private void auswDatenApollo() {
		double min_Boden = verwArtikel.getToleranzenListe().get(0)
				.getWert_min();
		double max_Boden = verwArtikel.getToleranzenListe().get(0)
				.getWert_max();

		double min_Radius = verwArtikel.getToleranzenListe().get(1)
				.getWert_min();
		double max_Radius = verwArtikel.getToleranzenListe().get(1)
				.getWert_max();

		double min_Flansch = verwArtikel.getToleranzenListe().get(2)
				.getWert_min();
		double max_Flansch = verwArtikel.getToleranzenListe().get(2)
				.getWert_max();

		// erste Messung auswerten
		if (verwArtikel.getMessung_1()) {
			for (int i = 0; i < 6; i++) {

				System.out.println("messung 1");

				// Auswertung Boden
				double resultat = messungen_1[i];

				if (resultat >= min_Boden && resultat <= max_Boden) {
					auswertung_1[i] = true;
				} else {
					auswertung_1[i] = false;
				}

				// Auswertung Radius
				resultat = messungen_2[i];

				if (resultat >= min_Radius && resultat <= max_Radius) {
					auswertung_2[i] = true;
				} else {
					auswertung_2[i] = false;
				}
			}

		} else if (verwArtikel.getMessung_2()) {

			System.out.println("messung 2");

			for (int i = 0; i < 6; i++) {

				// Auswertung Boden
				double resultat = messungen_1[i];

				if (resultat >= min_Flansch && resultat <= max_Flansch) {
					auswertung_1[i] = true;
				} else {
					auswertung_1[i] = false;
				}
			}

		}
	}

	/**
	 * Decodiert die daten der Kapsel Royal
	 */
	private void decodeDatenRoyal(int index) {
		StringBuilder sb = new StringBuilder(daten);

		boolean abwechslung = true;

		for (int i = 0; i < daten.length(); i++) {
			// Trennzeichen suchen
			int trennzeichen = sb.indexOf(";");

			// Bei ende Daten Schleife beenden
			if (trennzeichen == -1) {
				break;
			}

			String s = sb.substring(0, trennzeichen);

			if (abwechslung) {
				messungen_1[index] = Double.valueOf(Integer.valueOf(s)
						/ faktorMessung);

				abwechslung = false;
			} else {
				messungen_2[index] = Double.valueOf(Integer.valueOf(s)
						/ faktorMessung);

				abwechslung = true;
			}

			sb = sb.delete(0, trennzeichen + 1);

			i = 0;
		}

	}

	/**
	 * Wertet die Daten der Kapsel Royal aus
	 */
	private void auswDatenRoyal() {
		double min_0 = verwArtikel.getToleranzenListe().get(0).getWert_min();
		double max_0 = verwArtikel.getToleranzenListe().get(0).getWert_max();

		double min_1 = verwArtikel.getToleranzenListe().get(1).getWert_min();
		double max_1 = verwArtikel.getToleranzenListe().get(1).getWert_max();

		// Auswertung Boden
		for (int i = 0; i < 4; i++) {
			double resultat = messungen_1[i];

			if (resultat >= min_0 && resultat <= max_0) {
				auswertung_1[i] = true;
			} else {
				auswertung_1[i] = false;
			}
		}

		// Auswertung Boden
		for (int i = 0; i < 4; i++) {
			double resultat = messungen_2[i];

			if (resultat >= min_1 && resultat <= max_1) {
				auswertung_2[i] = true;
			} else {
				auswertung_2[i] = false;
			}
		}
	}

	/**
	 * Decodiert die daten der Kapsel Apollo
	 */
	private void decodeDatenATI() {
		StringBuilder sb = new StringBuilder(daten);

		int j = 0;
		int k = 0;

		for (int i = 0; i < daten.length(); i++) {
			// Trennzeichen suchen
			int trennzeichen = sb.indexOf(";");

			// Bei ende Daten Schleife beenden
			if (trennzeichen == -1) {
				break;
			}

			String s = sb.substring(0, trennzeichen);

			// Wert der messung
			if (j > 3) {
				messungen_2[k++] = Double.valueOf(Integer.valueOf(s)
						/ faktorMessung);
				
			if (k>3){
					break;
				}

			} else {
				messungen_1[j++] = Double.valueOf(Integer.valueOf(s)
						/ faktorMessung);

			}
			sb = sb.delete(0, trennzeichen + 1);

			i = 0;
		}
	}

	/**
	 * Wertet die Daten der Kapsel Apollo aus
	 */
	private void auswDatenATI() {
		double min_0 = verwArtikel.getToleranzenListe().get(0).getWert_min();
		double max_0 = verwArtikel.getToleranzenListe().get(0).getWert_max();

		double min_1 = verwArtikel.getToleranzenListe().get(1).getWert_min();
		double max_1 = verwArtikel.getToleranzenListe().get(1).getWert_max();

		// erste Auswertung
		for (int i = 0; i < 4; i++) {

			double resultat = messungen_1[i];

			if (resultat >= min_0 && resultat <= max_0) {
				auswertung_1[i] = true;
			} else {
				auswertung_1[i] = false;
			}

			// Auswertung Radius
			resultat = messungen_2[i];

			if (resultat >= min_1 && resultat <= max_1) {
				auswertung_2[i] = true;
			} else {
				auswertung_2[i] = false;
			}

		}
	}

	/**
	 * 
	 * @return Messresultate Messung 1
	 */
	public double[] getResultat_1() {
		return messungen_1;
	}

	/**
	 * 
	 * @return Messresultate Messung 2
	 */
	public double[] getResultat_2() {
		return messungen_2;
	}

	/**
	 * 
	 * @return auswertung 1
	 */
	public boolean[] getAuswertung_1() {
		return auswertung_1;
	}

	/**
	 * 
	 * @return auswertung 2
	 */
	public boolean[] getAuswertung_2() {
		return auswertung_2;
	}

	/**
	 * 
	 * @param messungRoyalBoden
	 */
	public void setMessungRoyalBoden(List<Double> messungRoyalBoden) {
		this.messungRoyalBoden = messungRoyalBoden;
	}

	/**
	 * 
	 * @param wert
	 * @param index
	 */
	public void setMessungRoyalBodenEinzenl(double wert, int index) {
		// System.out.println("Grösse: " + verwArtikel.getToleranz(index));

		double min = verwArtikel.getToleranzenListe().get(2).getWert_min();
		double max = verwArtikel.getToleranzenListe().get(2).getWert_max();

		if (index < messungRoyalBoden.size()) {
			messungRoyalBoden.set(index, wert);

			// Auswertung setzen
			if (wert >= min && wert <= max) {
				auswertungRoyalBoden.set(index, true);
			} else {
				auswertungRoyalBoden.set(index, false);
			}

		} else {
			messungRoyalBoden.add(wert);

			// Auswertung setzen
			if (wert >= min && wert <= max) {
				auswertungRoyalBoden.add(true);
			} else {
				auswertungRoyalBoden.add(false);
			}
		}

	}

	/**
	 * 
	 * @return
	 */
	public List<Double> getMessungRoyalBoden() {
		return messungRoyalBoden;
	}

	/**
	 * 
	 * @param wert
	 * @param index
	 */
	public double getMessungRoyalBodenEinzenl(int index) {
		if (messungRoyalBoden.size() > index) {
			return messungRoyalBoden.get(index);
		} else {
			return 0;
		}
	}

	/**
	 * 
	 * 
	 * @param index
	 * @return boolean auswertung
	 */
	public boolean getAuswertungRoyalBodenEinzeln(int index) {
		return auswertungRoyalBoden.get(index);
	}

	/**
	 * Grösse der Arrayliste Royal Boden
	 * 
	 * @return int Messung Royal
	 */
	public int getGroesseMessung() {
		return messungRoyalBoden.size();
	}

}
```


----------



## faetzminator (24. Jul 2012)

Bis auf [c]VerwArtikel[/c] ok. Wie sieht diese Klasse aus?


----------



## headnut (24. Jul 2012)

Diese ist relativ gross und wird in der main Methode initialisiert. Habe hier ein kleiner Auszug:


```
package model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;

import tcp.utils;
import verwKapseln.Kapseln;

/**
 * Verwaltet sämtliche informationen
 * 
 * 
 * @date 29.06.2012
 * @author rs
 * @version 1.0
 * 
 */
public class VerwArtikel extends Observable implements TableModel, Serializable{

	// Standart Kapselliste
	private List<Kapseln> kapselListe_1;

	// Ausnahmefall Apollo
	// Da zwei Messungen unter gleichen Namen
	private List<Kapseln> kapselListe_2;

	// Speichert alle Kapseln sonlange der Auftrag läuft
	private List<List<Kapseln>> listeAuftrag = new ArrayList<List<Kapseln>>();

	// Speichert die Boxnummer solange der Auftrag läuft
	private List<String> listeBoxnummer = new ArrayList<String>();

	// Speichert die Kapsel Royal Boden Objekte Solange der Auftrag läuft
	private List<Kapseln> listeRoyalBoden = new ArrayList<Kapseln>();

	private List<ToleranzenListe> toleranzenListe;

	private ArrayList<ArtikelListe> artikelListe = new ArrayList<ArtikelListe>();

	private List<TableModelListener> tableListener = new ArrayList<TableModelListener>();

	private String daten;

	// Empfangene IO's
	private boolean[] ioEmpf1 = new boolean[16];
	private boolean[] ioEmpf2 = new boolean[16];
	private boolean[] ioEmpf3 = new boolean[16];
	private boolean[] ioEmpf4 = new boolean[16];
	private boolean[] ioEmpf5 = new boolean[16];
	private boolean[] ioEmpf6 = new boolean[16];
	private boolean[] ioEmpf7 = new boolean[16];
	private boolean[] ioEmpf8 = new boolean[16];

	// IO's zu senden
	private char[] ioSenden1 = new char[16];
	private char[] ioSenden2 = new char[16];
	private char[] ioSenden3 = new char[16];
	private char[] ioSenden4 = new char[16];
	private char[] ioSenden5 = new char[16];
	private char[] ioSenden6 = new char[16];
	private char[] ioSenden7 = new char[16];
	private char[] ioSenden8 = new char[16];

	// Senden Parameter
	private int paramater1;
	private int paramater2;
	private int paramater3;
	private int paramater4;
	private int paramater5;
	private int paramater6;
	private int paramater7;
	private int paramater8;

	// Aktiver Kapseltyp
	private String artNr;

	private int nutzen;
	private String typKapsel;
	private String boxNummer;
	private String auftragsNr;

	private String aktivesFenster;

	private Kapseln kapseln;
	private Kapseln kapselRoyal;

	private boolean bMessungGest;
	private boolean bMessung1;
	private boolean bMessung2;

	private boolean bNutzenFinish;
	private boolean bFreigMessung;

	private boolean bRoyalBodenfertig;

	private int anzRoyal = 0;

	/**
	 * Konstruktor
	 */
	public VerwArtikel() {

		kapselListe_1 = new ArrayList<Kapseln>();
		kapselListe_2 = new ArrayList<Kapseln>();

		toleranzenListe = new ArrayList<ToleranzenListe>();

		for (int i = 0; i < ioSenden1.length; i++) {
			ioSenden1[i] = new Character('0');
			ioSenden2[i] = new Character('0');
			ioSenden3[i] = new Character('0');
			ioSenden4[i] = new Character('0');
			ioSenden5[i] = new Character('0');
			ioSenden6[i] = new Character('0');
			ioSenden7[i] = new Character('0');
			ioSenden8[i] = new Character('0');
		}

		bNutzenFinish = false;
		bFreigMessung = false;
	}
```


----------



## bygones (24. Jul 2012)

da hast du jdf swing Klassen dabei.

Das scheint an sich schon komisch, ein Artikel ist ein ganzes TableModel? eine dem Anschein nach Datenklasse ist mit Swing vermischt ?


----------



## headnut (24. Jul 2012)

Es ist eigentlich die Verwaltung eines kompletten Artikels

Da jedoch eine Tabelle dabei ist, ist es auch das model der table. Könnte es dies sein meinst du?


----------

