Menu

Metoda deserializacji

kr3niu
2012-06-16
2012-06-17
  • kr3niu

    kr3niu - 2012-06-16

    Ahoj,

    Mam watpilwosci co do metody readObjects.
    Po co ona wlasciwie ma zwracac obiekt typu Objects?

    Już mówię o co mi chodzi.

    Pierwotne jest założenie takie

    example_l1 klasa1 = new example_l1();
    klasa1.liczba=3;
    example_l1 klasa2 = new example_l1();
    Java2RDBSerializer serial = new Java2RDBSerializer(null);
    serial.writeObject(null,klasa1);
    Java2RDBDeserializer deserial = new Java2RDBDeserializer(serial.connh);
    Object obj = new Object();
    obj = deserial.readObject();

    I teraz jest takie zalozenie, ze obj ma byc rowny klasie example_1.
    To nie ma szans wyjsc, "zajedziemy" sie, zanim to nam wyjdzie.

    W kodzie deserializera
    Class<?> klasa = Class.forName(objectRow.getClassName());

    metoda forName ma tworzyc nowa klase na podstawie tej z bazy danych, w tej
    chwili to nie dziala (chociaz getClassName() zwraca nazwe klasy) i moim zdaniem
    nie bedzie szybko dzialal. To raczej trzeba inaczej do tego podejsc

    Metoda readObject nie powinna nic zwracac, a powinna jedynie "wypelniac" pola w klasie,
    podklasach, interfejsach etc.

    czyli

    Java2RDBDeserializer deserial = new Java2RDBDeserializer(serial.connh);
    example_l1 obj = new example_l1();
    deserial.readObject(obj)

    Dalej były by listowane polad w klasie example_l1 i wypelniane wg bazy danych.

    Proszę o odpowiedzi programistów co myślą o tym sposobie, żeby można dalej zrobić
    jakikolwiek krok naprzód.

     
    • Andrzej Marciniak

      Metoda readObject() powinna zwracać obiekt typu Object. Proszę zerknąć do dokumentacji przykładowego deserializera XML:
      http://docs.oracle.com/javase/6/docs/api/java/beans/XMLDecoder.html

      W dokumentacji interfejsu Serializable, też można znaleźć wskazówki jakie metody powinny być implementowane w mechanizmie serializera/deserializera :
      http://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html

      Najlepsza jest pełna specyfikacja serializacji obiektów (i przykład standardowej implementacji ObjectInputStream):
      http://docs.oracle.com/javase/6/docs/platform/serialization/spec/input.html
      proszę zerknąć na:
      public final Object readObject()
      throws OptionalDataException, ClassNotFoundException,
      IOException;

      Przy deserializacji obiektów, nie możemy statycznie typizować zwracanych obiektów, jeśli nie znamy kolejności zapisu. Dlatego zawsze wynik działania f. readObject jest przypisywany do zmiennej referencyjnej typu Object, a dalej wzystko możemy typizować dynamicznie przy użyciu mechanizmu refleksji

      Do tego aby napisać proste testy ser/deser nie musicie korzystać ze skomplikowanych rozwiązań. Wystarczy zapisać pojedynczy obiekt (złożony obiekt) i później odczytać ten obiekt korzystając z operatora konwersji, np.

      Java2RDBSerializer e = new Java2RDBSerializer(null);
      e.writeObject(new JButton("Hello, world"));
      e.close();

      Java2RDBDeserializer deserial = new Java2RDBDeserializer(serial.connh);
      JButton obj = (JButton) deserial.readObject();

      Przy większej kolejce obiektów różnych typów zapisanych do bazy, należy zapewnić ich włąsciwe typowanie w odpowiedniej kolejności przy odczycie, i tyle.

       

      Last edit: Andrzej Marciniak 2012-06-16
      • kr3niu

        kr3niu - 2012-06-17

        Dziękuje za zainteresowanie,

        W sumie rzeczywiście, problem tam polegał na tym, że była serializowana nie pełna nazwa, tylko krótka nazwa.
        W tej chwili deserializatorowi brakuję tylko obsługi ArrayList. Zaraz będzie skończony.

         

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.