serialization drama

4 отговора 201 прегледа
#1

serialization drama

здравейте,

сериализирам си значи едни обектчета във файлове. обектите всички са от един клас, слагам ги по един във файл. всичко е прекрасно докато в единия от обектите не се появи низ със символи за край на ред в него.

в този случай сериализацията минава успешно, но функцията unserialize(), която трябва да ми възстанови обекта от текстовото му представяне във файла се озъбва с мистична грешка - казва, че файла е "корумпиран" някъде около края - най-често 139тия от 140ина символа.

засега заобиколих проблема, като прекарвам низа, който може да съдържа нови редове през base64 кодиране при запис и декодиране при четене. работи, но искам да знам, защо предишната версия не работеше. никъде не намерих из текстовете за сериализация на пхп обекти дето имам някакво споменаване за нови редове и други специални символи.

мерси предварително

ein heller Schein am Firmament
Отговор
в отговор на Mycлoн #2

Re: serialization drama

коя версия PHP ползваш?
да не хитваш бъг?
post-ни пример с кода си ...

иначе с base64_encode е добре, даже може да ползваш gz_compress

Отговор
в отговор на Mycлoн #3

Re: serialization drama

В последната версия на PHP има bugfix точно на функциите за сериализиране, като преди да я оправят е имало дълга дискусия какъв е точно проблема. Може да си попаднал на нещо такова

-----------------------------------------------------
Има - няма, ние сме длъжни да проверим
Отговор
в отговор на AcidMemory #4

Re: serialization drama

кода е почти 1:1 с примера от мануала - давам примера от мануала, който взех от цхм версията на [линк]

сега като се замисля, може и да е нещо от четенето на низа от файла преди десериализацията. средата е: пхп 4.3.1 на уиндоус 2000 ( уиндоуса е някаква неофициална версия отпреди финалната ( не ме питайте защо и какво - не съм я инсталирал аз и не мислех, че ще пречи ) )

ще го замъкна тия дни в офиса да го пробвам на линукс


<?php
// classa.inc:

class A
{
var $one = 1;

function show_one()
{
echo $this->one;
}
}

// page1.php:

include("classa.inc");

$a = new A;
$s = serialize($a);
// store $s somewhere where page2.php can find it.
$fp = fopen("store", "w");
fputs($fp, $s);
fclose($fp);

// page2.php:

// this is needed for the unserialize to work properly.
include("classa.inc");

$s = implode("", @file("store"));
//тук унсериализе ми казва лошите неща
$a = unserialize($s);

// now use the function show_one() of the $a object.
$a->show_one();
?>


те тва е

ein heller Schein am Firmament
Отговор
в отговор на Mycлoн #5

Re: serialization drama

в такъв случай явно проблемът не е в тебе
пробвах го набързо под моя линукс и нямаше никакви проблеми

единственото, което можеш да направиш е да видиш точното съобщение за грешка и да потърсиш в bugs.php.net

Отговор