gpt4 book ai didi

php - 如何使用 JMS Serializer 处理递归对象

转载 作者:搜寻专家 更新时间:2023-10-31 21:03:39 25 4
gpt4 key购买 nike

我正在尝试序列化和反序列化 Doctrine 对象图。

结构相当复杂,但这个例子总结了我的问题:

有一个 Company 实体与 Employee 具有 OneToMany 关系。
Employee 实体与 Company 具有 ManyToOne 关系。

序列化如下:

{
"company": {
"name": "MegaCorp",
"employees": [{
"name": "John Doe",
"company": null
}]
}
}

所以它null是对Employee 的父Company 的引用。对于序列化,这是可以的。但是现在当我反序列化这个 json 时,我在 Employee 对象中得到一个 null Company 。我想要(和期望)的是获得对父 Company 的正确引用。

这是否可以使用 JMS 序列化程序,如果可以,如何实现?
如果不可能,什么是好的解决方法?请记住,这是一个大图,我不想手动完成。

最佳答案

不幸的是,在反序列化时,序列化程序无法知道对象是否相同或实际上是同一个对象。即使您可以递归地嵌套它们。

但是,将 @Accessor 注释与某些业务逻辑结合使用时,您可以获得所需的结果。所以离开你的例子:

class Company {
/**
* @Accessor(setter="addEmployees")
*/
private $employees;

public function addEmployee(Employee $employee)
{
if (!$this->employees->contains($employee)) {
$this->employees[] = $employee;
$employee->setCompany($this);
}
}

public function addEmployees($employees)
{
foreach ($employees as $employee) {
$this->addEmployee($employee);
}
}
}

class Employee {
/**
* @Accessor(setter="setCompany")
*/
private $company;

public setCompany(Company $company = null)
{
$this->company = $company;

if ($company) {
$company->addEmployee($this);
}
}
}

我认为这是一种比使用 @PostDeserialize 更自然的方法,因为您的代码中可能已经包含其中一些方法。此外,它以两种方式确保契约(Contract),因此如果您从 Employee 开始,您会得到相同的结果。

关于php - 如何使用 JMS Serializer 处理递归对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36640713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com