Zapis obiektu do i z pliku.

0

Cześć.

Napisałem kod na szybko, aby tylko zadać pytanie bez niepotrzebnego obudowywania go. Posiadam klase Publication która przechowuje publikacje posiadające nazwe i rok. W klasie library mam tablice publikacji i 2 metody. Dodawanie publikacji do tablicy i odczyt publikacji z tablicy. W klasie app tworze 2 publikacje. Następnie tworze obiekt typu library. Wywołuje dwukrotnie library.add dodając te 2 publikacje do tablicy. Następnie cały obiekt library zapisuje do pliku jasiu.txt. Teraz tworze zmienną library2 typu library której referencja wskazuje na null. Wczytuje do niej wcześniej utworzony plik. Dzięki temu mogę odczytać stan tablicy i dodawać nowe wartości mimo że referencje wskazują na 2 różne obiekty (logiczne).

Moje pytanie jest następujące. Czemu jak zapisuje i odczytuje obiekt library to zapisują/wczytują się wszystkie obiekty z tablicy itd.

Bo moje "pub" wskazuje na obiekt publikacja o nazwie Coś1 i wieku 11, a "pub2" wskazuje na obiekt typu publikacja o nazwie Coś2 i wieku 22. Przy pomocy library.add dodaje je po prostu do tablicy. Na co wskazuje referencja library, że zapisując ten obiekt zapisuje się cała tablica? Jakoś ciężko mi to zwizualizować sobie.

import java.io.Serializable;

public class Publication implements Serializable {

    private static final long serialVersionUID = 3072891696785468370L;
    private String name;
    private int age;

    Publication() {
    }

    Publication(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " " + age;
    }
}

import java.io.Serializable;

public class library implements Serializable {

    private static final long serialVersionUID = 6063038142603299096L;
    Publication pub[] = new Publication[200];
    int counter = 0;

    public void addPub(Publication pub) {
       this.pub[counter] = pub;
       counter++;
    }

    public Publication[] getPublications() {
        Publication[] result = new Publication[counter];
        for (int i = 0; i < counter; i++) {
            result[i] = pub[i];
        }
        return result;
    }

}

import java.io.*;

public class app implements Serializable {
    private static final long serialVersionUID = 8759558259713486446L;

    public static void main(String[] args) {
        Publication pub = new Publication("Coś1", 11);
        Publication pub2 = new Publication("Coś2", 22);

        library library = new library();

        library.addPub(pub);
        library.addPub(pub2);

        try (FileOutputStream fos = new FileOutputStream("jasiu.txt");
             ObjectOutputStream oos = new ObjectOutputStream(fos);) {
            oos.writeObject(library);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        library library2=null;
        try (FileInputStream fis = new FileInputStream("jasiu.txt");
             ObjectInputStream ois = new ObjectInputStream(fis);) {

            library2 = (library) ois.readObject();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

Publication[]tab = library2.getPublications();

        for (Publication publication : tab) {
            System.out.println(publication.toString());
        }
    }
}

Czy można to porównać do takiego rysunku? Że library jest referencją na wszystkie obiekty przekazane metodą add i zapisując tą referencje zapisuje każdy obiekt z tej tablicy?
(screen w załączniku)

0

Nie rozumiem pytania. Library wygląda tak:

public class library implements Serializable {
    Publication pub[] = new Publication[200];
//

Czyli zawiera w sobie tablicę obiektów Publication. Siłą rzeczy serializacja obiektu library serializuje całą tą tablicę.

0

Dokładnie o to pytam. Tworząc obiekt library zawiera on w sobie tablice obiektów publication które dodajemy za pomocą metody .add, Jeżeli bym dodał drugą tablice załóżmy jakiś Magazyn to zapisując obiekt library, zapisuje w takim wypadku już 2 tablice i przy odczycie dodrugiej referencji library posiadam wartości obu tych tablic i tej zmiennej counter która po 2 publikacjach wynosi 2?

1

Oczywiście, a jak inaczej sobie to wyobrażasz? Nie masz tam żadnych pól transient ani niczego co jest inicjalizowane po deserializacji, więc serializacja i deserializacja niejako klonuje ci cały obiekt ze wszystkimi jego polami, w tym tablicami które zawiera.

0

Dzięki wielkie. Czyli tak jak przypuszczałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1