/***************************************************************/
/* Prof. Dr. Carsten Vogt                                      */
/* FH Koeln, Fak. 07 / Nachrichtentechnik                      */
/* http://www.nt.fh-koeln.de/vogt                              */
/*                                                             */
/* Das Programm demonstriert die serialisierte Ein-/Ausgabe    */
/* von Objekten                                                */
/***************************************************************/

import java.io.*;

public class Serial {

 public static void main(String args[])
   throws IOException, ClassNotFoundException {

  // Klasse für auszugebende / einzulesende Objekte

  class Testobjekte implements Serializable {

   // Attribute
   String name;
   int ganzzahl;
   Testobjekte next; // Verweis auf nächstes Objekt in einer Kette von Objekten

   // Konstruktor
   Testobjekte(String name, int ganzzahl) {
    this.name = name; this.ganzzahl = ganzzahl; this.next = null; } 

   // Bildschirmausgabe des Objekts
   public void ausgabe(String bezeichnung) {
    System.out.println(" "+bezeichnung+": "+name+", "+ganzzahl); }

  }

  // Eine Kette von drei Objekten erzeugen und initialisieren

  Testobjekte obj1 = new Testobjekte("Anton",1);
              obj1.next = new Testobjekte("Berta",2);  
              obj1.next.next = new Testobjekte("Caesar",3);  

  System.out.println();
  System.out.println("Erzeugte Objekte:");
  obj1.ausgabe("obj1");
  obj1.next.ausgabe("obj1.next");
  obj1.next.next.ausgabe("obj1.next.next");
 
  // Ausgabestrom / Ausgabedatei erzeugen

  ObjectOutputStream objOutStr = new ObjectOutputStream(new FileOutputStream("testaus"));

  // Objekte serialisiert ausgeben

  System.out.println();
  System.out.println("Objekte werden serialisiert in die Datei geschrieben.");

  objOutStr.writeObject(obj1);
    // Man beachte: Nicht nur obj1 wird ausgegeben, sondern auch alle Objekte,
    // auf die obj1 direkt oder indirekt verweist!

  // Objekte im Programm löschen

  System.out.println();
  System.out.println("Objekte werden geloescht:");

  obj1 = null;
  System.gc(); // Garbage Collection, damit auch wirklich alles weg ist :-)

  System.out.println(" obj1: "+obj1);
  
  // Ab hier: Objekte wieder einlesen

  // Eingabestrom erzeugen

  ObjectInputStream objInStr = new ObjectInputStream(new FileInputStream("testaus"));

  // Objekte serialisiert einlesen

  System.out.println();
  System.out.println("Objekte werden serialisiert aus der Datei eingelesen.");

  obj1 = (Testobjekte)objInStr.readObject();
    // Man beachte: Nicht nur obj1 wird eingelesen, sondern auch alle Objekte,
    // auf die obj1 seinerzeit direkt oder indirekt verwiesen hatte.

  System.out.println();
  System.out.println("Eingelesene Objekte:");
  obj1.ausgabe("obj1");
  obj1.next.ausgabe("obj1.next");
  obj1.next.next.ausgabe("obj1.next.next");  
 
 }

}

