Input/Output Serialisierung von Objekten

karuzzo

Mitglied
Hallo,

ich bin kompletter neuling hier und habe schon mal eine Frage. Es geht um Serialisierung von Objekten und es scheint mir sehr kompliziert.
Nun dann, kommen wir mal zur meine Frage:

Java:
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.HashSet;
import java.util.Set;
import java.io.*;

public class BinaryFileReader extends ObjectInputStream {
  
    public String FilePath;
  
    public BinaryFileReader(String filePath) throws IOException, SecurityException {
      
        FilePath = filePath;
    }
  
    public String getPath() {
      
    return FilePath;
      
      
      
    }
  
    public Set<Object> getObjects() {
      
        Set<Object> object = new Set<Object>();
  
      
    }
}

Nun hier ist der Code und meine Aufgabenstellung lautet, das ich die Methode getObject die übergebene Datei öffnen und ein "Set" aller Objecte zurück geben soll. Ich finde zu dem "Set aller Object" zurück geben im Internet überhaupt keinen Anhaltspunkt, wie und was ich hier machen muss. Ich hoffe es ist hier jemand dabei der die Aufgabenstellung versteht und mir auch erklären kann, wie ich das Löse. Schon mal vielen dank im vorraus.

PS: Es soll der "Set" von den Objecten zurück gegeben werden, die in dieser Datei gespeichert werden.

Liebe Grüße,
karu


// Ganze Aufgabenstellung
EDIT: Implementieren Sie die Klasse BinaryFileReader, in dem Sie die Methoden getPath und getObjects vervollst¨andigen. Die Methode getPath soll hierbei den im Konstruktor uber- ¨ gebenen Dateipfad zuruckgeben. Die Methode ¨ getObjects soll die ubergebene Datei ¨ ¨offnen und ein Set aller Objekte zuruckgeben und anschließend die Datei wieder schließen
 

Flown

Administrator
Mitarbeiter
Ja, wenn ich schon alles sage, dann bitte alles! Denn die Aufgabenstellung lässt viele Fragen offen, wie...

... wie ist die Datei serialisiert
... was steht in der Datei
 

karuzzo

Mitglied
Hallo,

also jetzt wirklich alles:

Code:
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.HashSet;
import java.util.Set;
import java.io.*;

public class BinaryFileReader extends ObjectInputStream {
   
    public String FilePath;
   
    public BinaryFileReader(String filePath) throws IOException, SecurityException {
       
        FilePath = filePath;
    }
   
    public String getPath() {
       
    return FilePath;
       
       
       
    }
   
    public Set<Object> getObjects() {
       
       
   
       
    }
}

Code:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class BinaryFileWriter extends ObjectOutputStream {
   
    public BinaryFileWriter(String filePath) throws IOException, SecurityException {
    }
   
    public String getPath() {
    }
   
    public void write(Object... objects) throws IOException {
    }
}

Code:
import java.util.Set;

/**
* interface which indicates that a class has something to store in a binary
* file
*

*/
public interface HasSomethingToStore {
}

Code:
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class StorageController {

    public StorageController(String path) {
    }

    public void addObjectToStore(HasSomethingToStore object) {
    }

    public void loadAll() {
    }

    public void saveAll() {
    }
}

Aufgabenstellung:

(a) (3 Punkte) Implementieren Sie die Klasse BinaryFileReader, in dem Sie die Methoden getPath und getObjects vervollst¨andigen. Die Methode getPath soll hierbei den im Konstruktor uber- ¨ gebenen Dateipfad zuruckgeben. Die Methode ¨ getObjects soll die ubergebene Datei ¨ ¨offnen und ein Set aller Objekte zuruckgeben und anschließend die Datei wieder schließen. ¨

(b) (3 Punkte) Implementieren Sie die Klasse BinaryFileWriter, in dem Sie die Methoden getPath und write vervollst¨andigen. Die Methode getPath soll wie in Teilaufgabe a) den im Konstruktor ubergebenen Dateipfad zur ¨ uckgeben. Die Methode ¨ write soll die Datei ¨offnen, anschließend die ubergebenen Objekte in die Datei schreiben und zum Schluss die Datei wieder schließen. ¨

(c) (2 Punkte) Erweitern Sie das Interface HasSomethingToStore. Das Interface soll zwei Methoden beinhalten. Die erste Methode soll aufgerufen werden, falls etwas gespeichert werden soll und besitzt als Ruckgabewert eine Datenstruktur, welche alle zu speichernden Elemente enth ¨ ¨alt. Die zweite Methode soll aufgerufen werden, falls die zuvor gespeicherten Daten wieder geladen werden. Dieser Methode wird ein Objekt von der selben Datenstruktur, wie bei der ersten Methode ubergeben. ¨

(d) (4 Punkte) Implementieren Sie die Klasse StorageController, indem Sie den Konstruktor und die Methoden loadAll, saveAll, addObjectsToStore vervollst¨andigen. Die Methode addObjectsToStore fugt dem ¨ StorageController ein Objekt, welches das Interface HasSomethingToStore implementiert, hinzu. Die Methode saveAll ruft auf allen vorher hinzugefugten Objekten die entsprechende Methode des Interfaces auf und speichert die ¨ Ruckgabewerte in einer Datei. Die Methode ¨ loadAll l¨adt zuerst die gespeicherte Datei und ruft auf allen Objekten die entsprechende Methode des Interfaces auf. Achten Sie darauf entsprechende Exceptions abzufangen.

(e) (2 Punkte) Fugen Sie das Interface ¨ HasSomethingToStore den Klassen Player und UserManager hinzu und implementieren Sie die Funktionen des Interfaces passen zu den jeweiligen Klassen.
 

Flown

Administrator
Mitarbeiter
Also diese Klassenrümpfe und die Angabe sind der Graus. Ich weiß gar nicht wo ich anfangen soll. "Composition over Inheritance", .... ach vergiss es, ist ja eine Übung.
Mein Vorschlag wäre, die Anzahl der serialiiserten Objekte voran zu serialisieren und dann die Objekte und somit die umgekehrte Reihenfolge wieder auslesen:
Java:
class BinaryFileReader extends ObjectInputStream {
 
  private final String path;
  private Set<Object> objects;
 
  public BinaryFileReader(String path) throws IOException, SecurityException {
    super(new FileInputStream(path));
    this.path = path;
  }
 
  public String getPath() {
    return path;
  }
 
  public Set<Object> getObjects() {
    if (objects == null) {
      objects = new HashSet<>();
      try (BinaryFileReader ois = this) {
        final int nrObjects = ois.readInt();
        for (int i = 0; i < nrObjects; i++) {
          objects.add(ois.readObject());
        }
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      }
    }
    return objects;
  }
}
 

karuzzo

Mitglied
Hey,

erst mal viele Dank an dich Flown, im ernst. Ich finde was du machst nicht selbstverständlich.

Ich habe versucht die b) zu lösen, sind Fehler enthalten gar ist mein ganzer Code falsch?:

Code:
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class BinaryFileWriter extends ObjectOutputStream {
   
    public String FilePath;
   
    public BinaryFileWriter(String filePath) throws IOException, SecurityException {
   

    FilePath = filePath;   
       
    }
   
    public String getPath() {
        return FilePath;
    }
   
    public void write(Object... objects) throws IOException {
       
    // After import FileWriter and BufferedWriter we ca  write on the file.
        try {
           
            FileWriter fw = new FileWriter(FilePath);
            BufferedWriter bw = new BufferedWriter(fw);
           
            bw.write(FilePath); // as example
            bw.close(); // close the writer
           
        } catch (FileNotFoundException e) {
            // TODO: handle exception
        }

Das ist das, was ich mir bisher ergooglen konnte. Ich habe leider keinen schimmer wie ich die c) lösen kann. Nicht einmal einen kleinen ansatz..

Kannst du mir da vllt ein paar Tipps geben wie ich hier vorgehen sollte?

Liebe Grüße,
karu
 

Flown

Administrator
Mitarbeiter
Letzte Hilfestellung von mir, dann solltest du etwas Grunlagen lernen und dich nochmal über die Aufgabe stürzen:
Java:
class BinaryFileWriter extends ObjectOutputStream {
  
  private final String path;
  private boolean isConsumed;
  
  public BinaryFileWriter(String path) throws IOException, SecurityException {
    super(new FileOutputStream(path));
    this.path = path;
    this.isConsumed = false;
  }
  
  public String getPath() {
    return path;
  }
  
  public void write(Object... objects) throws IOException {
    if (isConsumed) {
      throw new IllegalStateException("Outputstream already used and closed");
    }
    final Object[] pendingSerializations = objects == null ? new Object[0] : objects;
    try (BinaryFileWriter oos = this) {
      oos.writeInt(pendingSerializations.length);
      for (Object o : pendingSerializations) {
        oos.writeObject(o);
      }
    }
    isConsumed = true;
  }
}
 

Flown

Administrator
Mitarbeiter
Deinen Vortragenden kannst du gern mal berichtigen, dass das Konstrukt eher anders aussehen sollte. Du könntest einmal fragen, warum die BinaryFileReader/Writer von den ObjectInput/OutputStreams ableiten und das man das so nicht macht.
 

Oben