![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Mam problem z serializacją obiektu posiadającego inne obiekty. Może przykład coś wyjaśni:
Efekt serializacji poszczególnych pól tablicy map jest prawidłowy ale w przypadku serializacji obiektu map :
Serializacji usilnie ładuje do sesji wszystko z obiektu łącznie atrybutem map, który już wcześniej sobie do sesji zapisałem i w __wakeup pobrałem z powrotem. Jak zrobić aby serializując obiekt zapisać sobie proste zmienne a pozostałe serializować ręcznie. A może jest jakiś inny lepszy sposób radzenia sobie z obiektami zawierającymi inne obiekty? ps. poprawiłem (IMG:style_emoticons/default/smile.gif) pisałem z ręki gdyż klasa zainteresowana serializacją ma już ponad 1000 linii i nie widziałem sensu jej tu całej pchać. Jest to wycinek tej klasy generujący moją frustrację oraz błąd. Ten post edytował vegelus 24.03.2010, 14:34:13 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 428 Pomógł: 128 Dołączył: 17.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Aleś sobie namieszał (IMG:style_emoticons/default/smile.gif)
no i jeszcze:
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 580 Pomógł: 85 Dołączył: 25.03.2010 Skąd: Skrzyszów :) Ostrzeżenie: (0%) ![]() ![]() |
1. if (!isset($_SESSION['map'])) { 2. $map = new map(4, 4); 3. $_SESSION['map'] = serialize($map); 4. } else { 5. $map = unserialize($_SESSION['map']); 6. } Takiego mixu to ja już dawno nie widziałem (IMG:style_emoticons/default/smile.gif) Tworzysz obiekt a potem odrazu go serializujesz, nie wykonując na nim żadnych operacji (IMG:style_emoticons/default/smile.gif) To może ci się wydawać dobre i działać, ale świadczy tylko o złym zaprojektowaniu klasy. Zastanów się czy tych 1000 lini kodu nie da się rozłożyć do kilku klas, bo takie giganty strasznie zalatują "god's class", a z tąd już tylko krok do programowania strukturalnego. Edit: A poza tym staraj się utrzymywać jakąć stałą konwencję co do nazewnictwa, a nie mieszaj polskiego z angielskim, albo rybki albo akwarium (IMG:style_emoticons/default/smile.gif) A teraz będzie troche na temat (IMG:style_emoticons/default/smile.gif) A że poźno jest, a ja zmęczony to będzie to metoda brutal force (IMG:style_emoticons/default/smile.gif) Po serializacji map chamsko wyczyść to pole unset'em, to dane nie będą się dublować, zakładająć oczywiście że nie masz jakoś dziwnie zaimplementowanych destruktorów w fildzie A teraz dobranoc, koniec imprezy (IMG:style_emoticons/default/smile.gif) Ide spać Ten post edytował zend 25.03.2010, 23:26:36 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za odpowiedz.
Jeszcze są dwie linijki kodu w index.php
Na twoje rozwiązanie także wpadłem i zrobiłem sobie taką funkcję __sleep
Myślałem jednak, że istnieje jakiś ładniejszy sposób serializacji obiektów kontenerowych. Dla potomnych może jeszcze podam jak budzę obiekt do życia pozostawiając oryginalne nazewnictwo:
Udało mi się w końcu upchnąć obiekt w sesji (IMG:style_emoticons/default/smile.gif) Najwięcej czasu zajęło mi osiągnięcie tego efektu:
Serializacjia przy pierwszym odpaleniu strony jest idealna, wszystkie obiekty wewnętrzne są w sesji i po deserializacji się odtwarzają, więc można powiedzieć, że osiągnąłem jakiś sukces. Ale po wykonaniu działań i przeładowaniu strony pojawia się problem, którym już nie wiem jak sobie poradzić. Mianowicie przy drugiej serializacji do zmiennej $_SESSION ładuje mi się coś takiego:
czyli obiekty hero i map nie zostały zniszczone i przekazane do serializacji jako obiekty anie NULL, co powoduje błąd przy deserializacji Warning: unserialize() expects parameter 1 to be string, object given in D:\WebServ\httpd-users\pole_gry\index.php on line 8 Ten post edytował vegelus 26.03.2010, 00:45:34 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 580 Pomógł: 85 Dołączył: 25.03.2010 Skąd: Skrzyszów :) Ostrzeżenie: (0%) ![]() ![]() |
Pokręć się koło tematu session_register, bo wygląda na to że obiekt w sesji jest automatycznie deserializowany, a funkcja unserialize przyjmuje stringi a nie już odserializowane obiekty (IMG:style_emoticons/default/smile.gif) Wszystko działa ok, wygląda na to że brakowało Ci tego klocka o automatycznej deserializacji (IMG:style_emoticons/default/smile.gif)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 9.10.2025 - 04:08 |