Serializacja DefaultTableModel

0

Posiadam hashmape gdzie kluczem jest data, a wartoscia ArrayLista obiektów DefaultTableModel. Z zalozenia nie znam kluczy (tzn. zbyt dlugie byloby przeszukiwanie kluczy np. od 1990 roku do 2011), wystepuja tylko te obiekty które mają dodany model/modele do ArrayListy. Przy serializacji hashmapy w zasadzie wszystko przechodzi pomyślnie, jednak rozmiar pojedynczego modelu Jtable wychodzi 3-30KB co jest jednak nie do zaakceptowania, gdyz z zalozenia bedzie tam >3000 modeli. Najprosciej byloby serializowac obiekt uzyskany z DefaultTableModel metoda getModel(), jednak w jaki sposob to zrobic? Skoro nie wiem co jest w hashmapie nie moge wyciagnac kazdego modelu poprzez getModel(), musze serializowac cale DefaultTableModel. Lub jak serializowac DefaultTableModel bez wszystkich dodatkow typu rendererów itp. (najlepiej sam model)? Wiem, że od tego jest transient jednak tutaj nie ma go gdzie chyba zastosować.

0

Coś namieszałeś. DefaultTableModel to tylko model danych i nie ma metody getModel(). Taką metodę ma JTable.
W tej hashmapie w końcu przechowujesz arraylist'y DefaultTableModel czy JTable?

0

Chodziło o metodę getData().

Wygląda to tak:
mam hashmapę: HashMap<Integer, MyList>
Integer to daty np. 19072011
MyList to klasa zawierajaca: ArrayList<SingleTable> myList;
Klasa SingleTable rozszerza DefaultTableModel

Serializując całą hashmapę w pliku jest pełno śmieci np:

ignoreSortChangeZ isRowHeightSetI 	rowHeightI 	rowMarginZ rowSelectionAdjustingZ rowSelectionAllowedZ showHorizontalLinesZ showVerticalLinesZ 
sorterChangedZ surrendersFocusOnKeystrokeZ updateSelectionOnSortL columnModelt $Ljavax/swing/table/TableColumnModel;L 	dataModelt Ljavax/swing/table/TableModel;L dropModet Ljavax/swing/DropMode;L 
editorRemovert #Ljava/beans/PropertyChangeListener;L 	gridColort Ljava/awt/Color;L preferredViewportSizet Ljava/awt/Dimension;L 
printErrort Ljava/lang/Throwable;L rowModelt Ljavax/swing/SizeSequence;L selectionBackgroundq ~ L selectionForegroundq

Problem polega na tym, że dat może być bardzo dużo np. 20 lat, co rowna sie sprawdzeniu 20*365 kluczy (wtedy jezeli odnaleziono MyList mozna wyciagnac modele). Chcialbym to jednak zrobic tak aby serializowal sie sam model, a obecnie serializuje sie jakby cala konfiguracja JTable. Do tego dochodzi problem serializacji przy jednoczesnej edycji wartosci w tabeli. Serializacja jest wykonywana przy zamykaniu programu, jednak jezeli edycja ktoregos pola nie zostala zakonczona rzucany jest wyjatek: "java.io.NotSerializableException: java.lang.reflect.Constructor" - (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6441373). Dlatego chce wyciagnac samą tablice data, jednak jak to zrobic bez przeszukiwania wszystkich kluczy?

0

Najlepiej i najwygodniej będzie imho napisanie w klasie SingleTable metod:

private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

W nich napisać dokładnie co ma być (de)serializowane.

http://java.sun.com/developer/technicalArticles/Programming/serialization/

0

Wielkie dzieki, poczytam zaraz i sprobuje, pewnie bedzie dzialalo tak jak chce.

W poszukiwaniu znalazlem tez ze HashMapa ma metodę keySet() dzięki której pewnie też bym osiągnął zamierzony cel (znałbym juz klucze bez zbednego przeszukiwania), jednak to co podałeś jest raczej strzałem w 10 ;-)

0

HashMap ma jeszcze metodę values, która zwraca kolekcję wszystkich wartości - nawet nie trzeba się odwoływać po kluczu. Ale napisanie własnych metod serializujących jest lepszym rozwiązaniem. Gdzie nie będziesz zapisywał będzie tylko jedna linijka kodu. I nie zależnie czy to będzie siedzieć w hashmapie, pojedynczym obiekcie czy whatever - będzie działać.

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