Отношение будет сохранено, но оно будет отличаться от ожидаемого. Когда вы сериализуете два экземпляра Character, которые оба ссылаются на один и тот же EquipmentHandler, вы получите два отдельных экземпляра этого EquipmentHandler вместо одного, который вы ожидали. Как показывает этот пример:
<?php
echo "BEFORE SERIALIZE:\n";
class A { }
class B { }
$a = new A;
$b = new B;
$a -> b = $b;
$a2 = new A;
$a2 -> b = $b;
var_dump($a->b);
var_dump($a2->b);
echo "AFTER SERIALIZE:\n";
$a3 = unserialize(serialize($a));
$a4 = unserialize(serialize($a2));
var_dump($a3->b);
var_dump($a4->b);
Вывод этого:
BEFORE SERIALIZE:
object(B)#2 (0) {
}
object(B)#2 (0) {
}
AFTER SERIALIZE:
object(B)#5 (0) {
}
object(B)#7 (0) {
}
Ищите число после фунта. Это относится к идентификатору объекта в PHP. Перед сериализацией $ a-> b и $ a2-> b обращаются к объекту с идентификатором объекта # 2: один и тот же экземпляр. Но после сериализации они ссылаются на идентификаторы объектов № 5 и № 7: разные экземпляры.
Это может или не может быть проблемой для вас.
Чтобы восстановить соединение с одним B-объектом, вам придется немного усложниться. Вы можете использовать обработчик __sleep () в A, чтобы сгладить фактическую ссылку на МОМЕНТ B только упоминанием B: «У меня была ссылка на B». Затем реализуйте обработчик __wakeup (), используя упоминание экземпляра B в A, чтобы получить один экземпляр нового объекта B.
КСТАТИ. Расширение сеанса PHP уже выполняет сериализацию автоматически, вам не нужно предварительно сериализовать его самостоятельно:)