Autor Wątek: Serializacja - tworzenie gry na PC i uruchomienie jej na Androidzie  (Przeczytany 8749 razy)

Offline Xion

  • Moderator
    • xion.log

  • +2
# Luty 22, 2013, 17:30:10
Nieprawda. Każdy z tych formatów to plik tekstowy + masa dodatkowych reguł. Ja sugeruję, żeby te reguły wymyśleć samemu jak najprościej.
I pisać fafnasty parser? No bez jaj. Formaty są wystarczająco proste. Jeśli JSON czy YAML ci nie pasuje, to może po prostu CSV? :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Luty 22, 2013, 21:09:40
JSON jest bardzo sexi a kocham go za to ze w iOS Obiekty w pamieci sa trzymane tak jakby w ten sam sposob :D

Offline Veldrin

  • Użytkownik

  • +3
# Luty 22, 2013, 21:31:43
Za standard XML'a ludzi powinni karać dożywotnim pisaniem w Javie, ale JSON moim zdanie to pure format. Prosty, łatwy, CZYTELNY.

Offline Avaj

  • Użytkownik

# Luty 22, 2013, 22:39:03
heh, kiedyś ludzie stali za XMLem murem a teraz się na JSONa przerzucili to wszyscy JSONa uwielbiają :) ja tam lubię i jeden i drugi, gorzej jak ktoś próbuje połączyć bo wtedy wychodzi taki potworek: http://publib.boulder.ibm.com/infocenter/wsdatap/v3r8m1/index.jsp?topic=%2Fxs40%2Fconvertingbetweenjsonandjsonx06.htm

Offline deadeye

  • Użytkownik

  • +1
# Luty 23, 2013, 00:06:00
Hmm, niestety nigdy nie interesowałem się robieniem czegoś takiego, jeśli już to zawsze serializacja ^^
Który z tych wymienionych przez Kos'a formatów jest najbardziej odpowiedni? Który z nich jest w miarę najprostszy i pozwoli mi bez problemu odtworzyć grę na innych urządzeniach?
Chyba źle rozumiesz "serializacja", zapis obiektów do json/xml też jest serializacją.
Automatyczna serializacja do json (najlepsza opcja) http://code.google.com/p/google-gson/
Gson gson = new Gson();
String json = gson.toJson(myAwesomeLevel);   
// zapisac do pliku jako tekst

deserializacja:
//odczytac tresc pliku do stringa
Level levelFromFile = gson.fromJson(trescJson, Level.class);   

Oczywiście klasy mogą zawierać dowolnie dużo zagnieżdzonych innych klas, tablic, list itd. Wszystko jest ładnie serializowane, i to lepiej niż standardowym mechanizmem javy (nie wymaga interfejsu Serializable). Jedyne o czym trzeba pamiętać to że deserializacja nie wywołuje konstruktora, więc jeśli niektóre pola muszą być inicjalizowane niezależnie od danych odczytanych z pliku, to trzeba ręcznie wywołać do tego metodę. Całość działa na Andku i desktopie, i całkiem nieźle radzi sobie z dość dużymi (1MB+ tekstu) plikami.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Luty 23, 2013, 01:03:02
Cytuj
I pisać fafnasty parser? No bez jaj. Formaty są wystarczająco proste. Jeśli JSON czy YAML ci nie pasuje, to może po prostu CSV? :)
Dokłądniej to mi chodziło o SSV (Space Separated Values). Parsowanie banalne nawet przy użyciu scanf/streamów.

Offline Paweł

  • Użytkownik

# Luty 23, 2013, 01:09:24
Cytuj
Parsowanie banalne nawet przy użyciu scanf/streamów.
Ok, ale taki plik jest trudny do edycji. Myślę że chcąc edytować takie coś mieć gdzieś pod ręką szablon, z objaśnieniem wszystkich kolejnych wartości.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Luty 23, 2013, 01:27:32
Cytuj
Ok, ale taki plik jest trudny do edycji. Myślę że chcąc edytować takie coś mieć gdzieś pod ręką szablon, z objaśnieniem wszystkich kolejnych wartości.
Powiedzmy sobie szczerze: jakiego formatu na własne potrzeby byś nie użył i tak go nie udokumentujesz. ;)

Offline Xender

  • Użytkownik

  • +2
# Luty 23, 2013, 10:42:44
Dokłądniej to mi chodziło o SSV (Space Separated Values). Parsowanie banalne nawet przy użyciu scanf/streamów.
VS

Automatyczna serializacja do json (najlepsza opcja) http://code.google.com/p/google-gson/
Gson gson = new Gson();
String json = gson.toJson(myAwesomeLevel);   
// zapisac do pliku jako tekst

deserializacja:
//odczytac tresc pliku do stringa
Level levelFromFile = gson.fromJson(trescJson, Level.class);   

KK, trochę nie ten poziom abstrakcji, wiesz? Już widzę, jak ktoś radośnie popyla scanfem (ach, to kodowanie stringów zawierających spacje prze zapisie i odczycie), mając do wyboru gotowy, automatyczny, dobrze działający, sprawdzony i wydajny system. Przy czym odnoszę wrażenie, że dobry parser JSONa może być szybszy, niż katowanie pliku wywoływaniem scanf co słowo.

Offline deadeye

  • Użytkownik

  • +1
# Luty 23, 2013, 13:23:08
Powiedzmy sobie szczerze: jakiego formatu na własne potrzeby byś nie użył i tak go nie udokumentujesz. ;)
Właśnie po to jest json, gdzie każde pole masz opisane nazwą - więc z automatu masz udokumentowany format.

Offline owyn

  • Użytkownik

# Luty 23, 2013, 13:55:10
Jedyne o czym trzeba pamiętać to że deserializacja nie wywołuje konstruktora, więc jeśli niektóre pola muszą być inicjalizowane niezależnie od danych odczytanych z pliku, to trzeba ręcznie wywołać do tego metodę.
??? Jesteś pewien? Nie używałem tej biblioteki, ale po raz pierwszy słyszę o czymś takim, żeby tworzyć instancje klasy bez wywołania konstruktora. W jaki sposób miałoby to być robione?

Offline deadeye

  • Użytkownik

# Luty 23, 2013, 14:08:11
??? Jesteś pewien? Nie używałem tej biblioteki, ale po raz pierwszy słyszę o czymś takim, żeby tworzyć instancje klasy bez wywołania konstruktora. W jaki sposób miałoby to być robione?
Przez refleksje - cały gson działa przez refleksje, żeby mieć bezpośredni dostęp do pól prywatnych. W obecnej wersji jeśli istnieje kontstruktor no-arg, to gson go wywoła (nawet jeśli jest prywatny), ale jeśli takiego nie ma, to nie wywoła nic.  W starszej wersji gson w ogóle nie wywoływał konstruktora, bo z założenia obiekt już był zainicjalizowany w momencie serializacji (żeby został utworzony zanim został zapisany, to konstruktor musiał być wywołany - więc teoretycznie wtedy wszystko zostało zanicjalizowane i wywołanie konstruktora drugi raz nie jest potrzebne).
« Ostatnia zmiana: Luty 23, 2013, 14:12:01 wysłana przez deadeye »

Offline St4rKiller070

  • Użytkownik

# Luty 23, 2013, 14:53:12
Jeszcze jedno małe pytanko ^^
Załóżmy że wciągnąłem całą tą moją grę do JSON'a. Do javy są inne biblioteki załóżmy OpenGL, na androidzie są inne. Jak więc taka gra miała by się uruchomić skoro nie ma dostępu do bibliotek na podstawie których została stworzona?
Nie wiem czy się do końca zrozumieliśmy: chodziło mi o to żeby całą grę zserializować po czym na androidzie zdeserializować i odpalić.

Offline ShadowDancer

  • Redaktor

# Luty 23, 2013, 15:19:27
Np. tak:
http://stackoverflow.com/questions/4929577/implementing-my-own-serialization-in-java

Nie wiem jak w javie, ale w c# możesz jeszcze automatycznie loopować po właściwościach obiektów, więc w javie powinien być odpowiadający mechanizm.

Offline deadeye

  • Użytkownik

# Luty 23, 2013, 15:38:17
Do javy są inne biblioteki załóżmy OpenGL, na androidzie są inne.
Nope. Większość bibliotek działa na Andku (z wyjątkiem np systemów okien, ale to captain obvious). W poprzednich postach wyraźnie napisałem, że gson działa na Andku i PC. Więc używasz tego samego kodu do zapisywania i odczytywania danych.

Cytuj
Jak więc taka gra miała by się uruchomić skoro nie ma dostępu do bibliotek na podstawie których została stworzona?
normalnie - w plikach trzymasz tylko uniwersalne dane, np nazwę pliku  tekstury, a nie już np. wskaźnik na teksturę w opengl. Gson działa wszędzie, więć bez problemu możesz to zrobić.