簡體   English   中英

如何使用JMS Serializer處理遞歸對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM