Doctrine2 export entité vers tableau

J'ai Product entité à plusieurs-à-un à Category entité. J'ai besoin de stocker Product dans la session. Tout d'abord, je cherche à mettre en œuvre \Serializable de l'interface du Produit. Comment dois-je sérialiser mes Category entité? Dois-je également mettre en œuvre \Serializable interface?

J'ai lu, que la sérialisation dans la doctrine est très mal opération et je pense à ce sujet:

Pouvons-nous obtenir les valeurs brutes de l'entité? Exactement ce que les données, stockées dans la base de données. Si on peut obtenir ces valeurs, on peut stocker n'importe où et de recréer l'objet!

J'ai lu doctrine2 code et de trouver la méthode Doctrine\ORM\Internal\Hydration\ObjectHydrator:hydrateRowData mais il est protégé. Est-il une api publique pour faire cela?

Mise à jour:

Je viens de copypaste et d'intégrer du code de BasicEntityPersister et il semble fonctionner.

    $product = $productsRepository->find($id);
if (!$product) {
throw $this->createNotFoundException('No product found for id ' . $id);
}
$uow = $em->getUnitOfWork();
$entityPersister = $uow->getEntityPersister(get_class($product));
$classMetadata = $entityPersister->getClassMetadata();
$originalData = $uow->getOriginalEntityData($product);
$result = array();
foreach ($originalData as $field => $value) {
if (isset($classMetadata->associationMappings[$field])) {
$assoc = $classMetadata->associationMappings[$field];
//Only owning side of x-1 associations can have a FK column.
if ( ! $assoc['isOwningSide'] || ! ($assoc['type'] & \Doctrine\ORM\Mapping\ClassMetadata::TO_ONE)) {
continue;
}
if ($value !== null) {
$newValId = $uow->getEntityIdentifier($value);
}
$targetClass = $em->getClassMetadata($assoc['targetEntity']);
$owningTable = $entityPersister->getOwningTable($field);
foreach ($assoc['joinColumns'] as $joinColumn) {
$sourceColumn = $joinColumn['name'];
$targetColumn = $joinColumn['referencedColumnName'];
if ($value === null) {
$result[$owningTable][$sourceColumn] = null;
} else if ($targetClass->containsForeignIdentifier) {
$result[$owningTable][$sourceColumn] = $newValId[$targetClass->getFieldForColumn($targetColumn)];
} else {
$result[$owningTable][$sourceColumn] = $newValId[$targetClass->fieldNames[$targetColumn]];
}
}
} elseif (isset($classMetadata->columnNames[$field])) {
$columnName = $classMetadata->columnNames[$field];
$result[$entityPersister->getOwningTable($field)][$columnName] = $value;
}
}
print_r($result);

Dans $result nous avons des valeurs brutes. Maintenant nous avons besoin d'une façon de créer un objet par ce tableau

source d'informationauteur striker