Ta klasa, a właściwie "metaklasa" służy do tworzenia wszystkich innych obiektów w całym języku Java.
Używamy jej po to, aby pozyskać wszelkie możliwe informacje o interesującej nas klasie. I zwróć uwagę, że "Class" nie pozyskuje informacji o OBIEKCIE klasy, tylko o samej KLASIE. Tak więc jesteśmy wstanie odzyskać swoisty "szkielet" klasy, oczywiście wartości też tam są, ale dzięki "Class" otrzymujemy informacje np. o nazwach zmiennych (nawet prywatnych), które często nie są dostępne.
No i tutaj przechodzimy do serializera. Baza danych mieści tabelę wartości i tabelę obiektów. Obiekty, które są przechowywane przez użytkownika zapisywane są do tabeli obiektów (a właściwie same ich definicje), a wartości pobrane za pomocą obiektu "Class" (służy do tego metoda "getDeclaredFields") są zapisywane w tabeli przeznaczonej dla wartości.
Podsumowując, "Class" służy do podglądania co klasa danego obiektu ma w środku i co powinniśmy zserializować. Przydatna rzecz ;)
Pytajcie dalej, jakikolwiek problem mile widziany ;D
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Dziekujemy za pomoc:)
A teraz kolejne pytanie a raczej prośba:) Czy mogł bys sprawdzić funkcje w RefTable które wrzucilismy z Grzegorzem, chcielibysmy wiedziec czy dobrze zrozumielismy wasza koncepcje tworzenia "odbić".
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Sprawdziłem funkcje, które wrzuciliście (na razie bez Map, Collection, Enum i Object).
Pobieranie informacji o klasie ma tak wygladac jak napisaliscie. Pobieranie wartosci pól też jest ok. Problem jest natomiast taki, ze te wszystkie klasy typu. Integer, Byte itp. posiadają pola, które nas nie obchodzą. Np.
mamy obiekt Integera:
Integer I = new Integer(5);
Po wywolaniu metody z RefTable: new RefTable.serializeInteger(I) nasza tablica values przechowuje nastepujace wartosci:
Nas obchodzi tylko wartość 5 w tym wypadku. Reszta to pole trzymające np. maksymalną wielkość Integera (pole 2: 2147483647). Jest ono identyczne dla wszystkich Integerow wiec w serializerze musimy je pominąć.
Dopiero pole values[7] trzyma wartość która nas interesuje.
Trzeba przejrzeć te tablice dla każdej z funkcji i zobaczyć, które pola danego typu trzyma faktyczną wartość obiektu.
Tu macie kod jaki użyłem do "testowania funkcji" (Sysout rządzi ;) ):
RefTable A = new RefTable();
Boolean B = true;
A.serializeBoolean(B);
Integer I = new Integer(5);
A.serializeInteger(I);
Byte By= new Byte((byte) 7);
A.serializeByte(By);
Character C = new Character('D');
A.serializeCharacter(C);
Double D = new Double(2.5);
A.serializeDouble(D);
Long L = new Long(12345);
A.serializeLong(L);
Float F = new Float (0.2);
A.serializeFloat(F);
String S = new String("S");
A.serializeString(S);
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
public int serializeFloat(Float object) throws ClassNotFoundException {
String pola = new String[1][2];
pola[0][0]="int";
pola[0][1]=Float.toString(object.floatValue());
id=streamer.insertObject(Class.forName(object.getClass().getName()).toString(), pola)
return id;
}
Zadziała w wypadku wszystkich typów wymienionych powyżej. Oczywiście toString wywolywane bedzie dla innej klasy oraz value odpowiednie dla klasy.
Last edit: PGaczynski 2012-06-25
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Pytajcie do woli, postaramy się odpowiedzieć i wyjaśnić wszystko, jeśli zajdzie tak potrzeba.
Class cls= Class.forName(obj.getClass().getName());
czy mógłbyś wytłumaczyć mi po co tworzymy ta klase w serializacji ?
No to po kolei :)
Ta klasa, a właściwie "metaklasa" służy do tworzenia wszystkich innych obiektów w całym języku Java.
Używamy jej po to, aby pozyskać wszelkie możliwe informacje o interesującej nas klasie. I zwróć uwagę, że "Class" nie pozyskuje informacji o OBIEKCIE klasy, tylko o samej KLASIE. Tak więc jesteśmy wstanie odzyskać swoisty "szkielet" klasy, oczywiście wartości też tam są, ale dzięki "Class" otrzymujemy informacje np. o nazwach zmiennych (nawet prywatnych), które często nie są dostępne.
No i tutaj przechodzimy do serializera. Baza danych mieści tabelę wartości i tabelę obiektów. Obiekty, które są przechowywane przez użytkownika zapisywane są do tabeli obiektów (a właściwie same ich definicje), a wartości pobrane za pomocą obiektu "Class" (służy do tego metoda "getDeclaredFields") są zapisywane w tabeli przeznaczonej dla wartości.
Podsumowując, "Class" służy do podglądania co klasa danego obiektu ma w środku i co powinniśmy zserializować. Przydatna rzecz ;)
Pytajcie dalej, jakikolwiek problem mile widziany ;D
Dziekujemy za pomoc:)
A teraz kolejne pytanie a raczej prośba:) Czy mogł bys sprawdzić funkcje w RefTable które wrzucilismy z Grzegorzem, chcielibysmy wiedziec czy dobrze zrozumielismy wasza koncepcje tworzenia "odbić".
Sprawdziłem funkcje, które wrzuciliście (na razie bez Map, Collection, Enum i Object).
Pobieranie informacji o klasie ma tak wygladac jak napisaliscie. Pobieranie wartosci pól też jest ok. Problem jest natomiast taki, ze te wszystkie klasy typu. Integer, Byte itp. posiadają pola, które nas nie obchodzą. Np.
mamy obiekt Integera:
Integer I = new Integer(5);
Po wywolaniu metody z RefTable: new RefTable.serializeInteger(I) nasza tablica values przechowuje nastepujace wartosci:
-2147483648
2147483647
int
[C@112f614
[C@1d9dc39
[C@93dcd
[I@b89838
5
32
1360826667806852920
true
Nas obchodzi tylko wartość 5 w tym wypadku. Reszta to pole trzymające np. maksymalną wielkość Integera (pole 2: 2147483647). Jest ono identyczne dla wszystkich Integerow wiec w serializerze musimy je pominąć.
Dopiero pole values[7] trzyma wartość która nas interesuje.
Trzeba przejrzeć te tablice dla każdej z funkcji i zobaczyć, które pola danego typu trzyma faktyczną wartość obiektu.
Tu macie kod jaki użyłem do "testowania funkcji" (Sysout rządzi ;) ):
RefTable A = new RefTable();
Boolean B = true;
A.serializeBoolean(B);
Integer I = new Integer(5);
A.serializeInteger(I);
Byte By= new Byte((byte) 7);
A.serializeByte(By);
Character C = new Character('D');
A.serializeCharacter(C);
Double D = new Double(2.5);
A.serializeDouble(D);
Long L = new Long(12345);
A.serializeLong(L);
Float F = new Float (0.2);
A.serializeFloat(F);
String S = new String("S");
A.serializeString(S);
A tu co mi zwróciła konsola:
BOOLEAN;
true
false
boolean
true
-3665804199014368530
INTEGER;
-2147483648
2147483647
int
[C@112f614
[C@1d9dc39
[C@93dcd
[I@b89838
5
32
1360826667806852920
true
BYTE;
-128
127
byte
7
8
-7183698231559129828
CHAR;
2
36
?
char
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
18
19
20
21
22
23
24
25
26
27
28
29
30
-1
-1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
?
?
?
?
?
?
65536
0
1114111
D
3786198910865385080
16
true
DOUBLE;
Infinity
-Infinity
NaN
1.7976931348623157E308
2.2250738585072014E-308
4.9E-324
1023
-1022
64
double
2.5
-9172774392245257468
LONG;
-9223372036854775808
9223372036854775807
long
12345
64
4290774380558885855
FLOAT;
Infinity
-Infinity
NaN
3.4028235E38
1.17549435E-38
1.4E-45
127
-126
32
float
0.2
-2671257302660747028
STRING;
[C@506f65
0
1
0
-6849794470754667710
[Ljava.io.ObjectStreamField;@291aff
java.lang.String$CaseInsensitiveComparator@ab95e6
W wypadku Stringa nie mam pojęcią w jaki sposób trzymana jest jego wartość.
Albo powyższt problem można rozwiązać tak:
public int serializeFloat(Float object) throws ClassNotFoundException {
String pola = new String[1][2];
pola[0][0]="int";
pola[0][1]=Float.toString(object.floatValue());
id=streamer.insertObject(Class.forName(object.getClass().getName()).toString(), pola)
return id;
}
Zadziała w wypadku wszystkich typów wymienionych powyżej. Oczywiście toString wywolywane bedzie dla innej klasy oraz value odpowiednie dla klasy.
Last edit: PGaczynski 2012-06-25