Menu

Interfejsy - co i jak.

2012-05-31
2012-06-25
  • Szymon Trawiński

    Pytajcie do woli, postaramy się odpowiedzieć i wyjaśnić wszystko, jeśli zajdzie tak potrzeba.

     
  • GKrzesinski

    GKrzesinski - 2012-06-22

    Class cls= Class.forName(obj.getClass().getName());

    czy mógłbyś wytłumaczyć mi po co tworzymy ta klase w serializacji ?

     
  • Szymon Trawiński

    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

     
  • MLechki

    MLechki - 2012-06-25

    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ć".

     
  • PGaczynski

    PGaczynski - 2012-06-25

    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);

     
  • PGaczynski

    PGaczynski - 2012-06-25

    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ść.

     
  • PGaczynski

    PGaczynski - 2012-06-25

    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

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.