[英]How to handle recursive objects with JMS Serializer
我正在嘗試序列化和反序列化Doctrine對象圖。
結構非常復雜,但這個例子總結了我的問題:
有一個與Employee
具有OneToMany關系的Company
實體。
Employee
實體與Company
具有ManyToOne關系。
這序列化如下:
{
"company": {
"name": "MegaCorp",
"employees": [{
"name": "John Doe",
"company": null
}]
}
}
因此, null
S中的參考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
更自然,因為您的代碼中可能已經有了一些這樣的方法。 此外,它以兩種方式確保合同,因此如果您從Employee
開始,您將獲得相同的結果。
在反序列化對象時手動設置引用是什么? 像這樣的東西:
class Company {
....
@PostDeserialize
public function setReferences()
{
foreach( $this->employees as $employee ){
$employee->setCompany( $this );
}
}
}
保持JSON實體盡可能簡單是一種很好的做法! 如果您必須處理這類問題,那么重新考慮您的數據模型的時刻到了!
另外,您是否考慮過使用HATEOAS(超媒體作為應用程序狀態的引擎)是一個原則,應該使用超文本鏈接來創建更好的API導航。 看起來像這樣:
{
"id": 711,
"manufacturer": "bmw",
"model": "X5",
"seats": 5,
"drivers": [
{
"id": "23",
"name": "Stefan Jauker",
"links": [
{
"rel": "self",
"href": "/api/v1/drivers/23"
}
]
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.