Я решил проблему реализации моей собственной сериализации и десериализации:
function cserialize($o,$raw=false){
static $fn=__FUNCTION__;
$otype = strtolower(gettype($o));
// Simple types
if(in_array($otype,array('null','boolean','integer','float','string','double'))){
$r = array(
'type'=>'raw',
'value'=>$o
);
if($raw)return $r;
return serialize($r);
}
//
if($otype == 'object'){
$oclass = get_class($o);
} else {
$oclass = null;
}
// Arrays
if(is_array($o) || $oclass == 'Doctrine\Common\Collections\ArrayCollection'){
$t = array();
foreach ($o as $element)
$t[] = $fn($element,true);
$r = array(
'type'=>'array',
'value'=>$t
);
if($raw)return $r;
return serialize($r);
}
// Objects
if($otype == 'object'){
$isEntity = (strpos($oclass, '\\Entity\\') !== false);
if($isEntity && $o->getId()!==null){
// Entity whit id - keep just id
$repository = explode('\\Entity\\',$oclass);
$repository[0] = implode('',explode('\\',$repository[0]));
$repository[1] = implode('',explode('\\',$repository[1]));
$repository = implode(':',$repository);
$repository = str_replace('Proxies__CG__','',$repository);
$r = array(
'type'=>'entity-stored',
'repository'=>$repository,
'id'=>$o->getId()
);
if($raw)return $r;
return serialize($r);
}
if(!$isEntity){
// Some kind of object - use normal serialization
$r = array(
'type'=>'raw',
'value'=>$o
);
if($raw)return $r;
return serialize($r);
} else {
$t = array();
foreach (get_class_methods($o) as $method) {
if(strncmp('get',$method,3)!=0 ||
$method == 'getAsFlatArray' ||
$method == 'getId'
)
continue;
$val = $o->$method();
$name = 'set'.substr($method,3);
if($val !== null)
$t[$name] = $fn($val,true);
}
$r = array(
'type'=>'entity-new',
'class'=>$oclass,
'value'=>$t
);
if($raw)return $r;
return serialize($r);
}
}
throw new Exception("Error in serializer", 1);
}
function cunserialize($o,$em,$raw=false){
static $fn = __FUNCTION__;
if(!$raw)$o=unserialize($o);
switch ($o['type']) {
case 'array':
$t=array();
foreach ($o['value'] as $element)
$t[] = cunserialize($element,$em,$raw);
return $t;
case 'entity-new':
$class = '\\'.$o['class'];
$r = new $class();
foreach ($o['value'] as $method => $value)
$r->$method($fn($value,$em,true));
return $r;
case 'entity-stored':
return $em->getRepository($o['repository'])->findOneById($o['id']);
case 'raw';
return $o['value'];
default:
throw new Exception("Error in unserializer", 1);
}
}
Так что теперь я могу назвать:
$es = cserialize($e);
$esu = cunserialize($es,$em);
Проблема заключается во сне и пробуждении свойств.
возможно, потеря ссылки с связанным с ней объектом (пользователем и компанией) попробуйте обновить их – Matteo
возможно эта ссылка http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/entities- in-session.html # serializing-entity-in-the-session может вам помочь. – yceruto
Код: echo $ e-> getUser(); echo $ e-> getCompany(); echo $ esu-> getUser(); echo $ esu-> getCompany(); дает test_user_name COMP_NAME test_user_name [Symfony \ Component \ Debug \ Exception \ ContextErrorException] Catchable Фатальная ошибка: Метод Доверенные \ __ CG __ \ TCOM \ TestWebBundle \ Entity \ Company :: __ ToString() должен возвращать строковое значение класса компании есть __toString, поэтому я попытаюсь «реализовать __sleep()» – cb1986ster