Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z serializacją obiektu
vegelus
post
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:
  1. class Map{
  2. private $wys;
  3. private $sze;
  4. private $map = array();
  5.  
  6. function __construct($wys,$sze){
  7. $this->wys = $wys;
  8. $this->sze = $sze;
  9. //przypisanie w map do każdego pola klasy obiektu z klasy field
  10. for ($x = 1; $x <= $this->sze; $x++) {
  11. for ($y = $this->wys; $y >= 1; $y--) {
  12. $losowa = rand(1, 4);
  13. $picPath = 'flor' . $losowa . '.png';
  14. $this->map[$y][$x] = new field($picPath);//obiekt nic nie robi poza przechowywaniem patha do obrazka i contentu pola
  15. }
  16. }
  17. }
  18.  
  19. function __sleep(){
  20. for ($x = 1; $x <= $this->sze; $x++) {
  21. for ($y = $this->wys; $y >= 1; $y--) {
  22. $_SESSION['maps'][$y][$x] = serialize($this->map[$y][$x]);
  23. }
  24. }
  25. return array('sze', 'wys');//chcę serializować tylko te dwa atrybuty
  26. }
  27. }


Efekt serializacji poszczególnych pól tablicy map jest prawidłowy ale w przypadku serializacji obiektu map :
  1. if (!isset($_SESSION['map'])) {
  2. $map = new map(4, 4);
  3. $_SESSION['map'] = serialize($map);
  4. } else {
  5. $map = unserialize($_SESSION['map']);
  6. }



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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zend
post
Post #2





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

Ostrzeżenie: (0%)
-----


Cytat(vegelus @ 24.03.2010, 12:51:58 ) *
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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 08:03