2016-04-05 22 views
1

我需要一點點幫助,我在下一個場景:JMS串行名單多態性與XML反序列化

AbtsractItem文件:

<?php 
namespace Com; 

use JMS\Serializer\Annotation as JMS; 

/** 
* @JMS\Discriminator(
*  field = "objectType", 
*  map = { 
*   "part": "Com\Part", 
*   "complement" : "Com\Complement" 
*   }, 
*  disabled=true 
*) 
*/ 
abstract class AbstractItem 
{ 
    protected $objectType; 
} 

部分文件:

<?php 
namespace Com; 

use JMS\Serializer\Annotation as JMS; 

class Part extends AbstractItem 
{ 
    /** 
    * @JMS\Type("string") 
    * @JMS\XmlElement(cdata=false) 
    */ 
    protected $objectType = "Part"; 
    /** 
    * @JMS\Type("string") 
    * @JMS\XmlElement(cdata=false) 
    */ 
    private $data; 
    //getters & setters 
} 

補充文件:

<?php 
namespace Com; 

use JMS\Serializer\Annotation as JMS; 

class Complement extends AbstractItem 
{ 
    /** 
    * @JMS\Type("string") 
    * @JMS\XmlElement(cdata=false) 
    */ 
    protected $objectType = "Complemet"; 
    /** 
    * @JMS\Type("string") 
    * @JMS\XmlElement(cdata=false) 
    */ 
    private $number; 
    //getters & setters 
} 

爲MyObject文件:

<?php 
namespace Com; 

use JMS\Serializer\Annotation as JMS; 

/** 
* @JMS\XmlRoot("MyObjects") 
*/ 
class MyObject 
{ 
    /** 
    * @JMS\Type("array<Com\AbstractItem>") 
    * @JMS\XmlElement(cdata=false) 
    * @JMS\XmlList(inline=false, entry="item")  
    */ 
    private $items; 
    //getters & setters 
} 

所以我預計像下一XML:

<MyObjects> 
    <item> 
     <objectType>Part</objectType> 
     <number>1237173</number>   
    </item> 
    <item> 
     <objectType>Complement</objectType> 
     <data>loremp ipsum...</data> 
    </item> 
</MyObjects> 

當我連載/ JSON中反序列化我有沒有問題,但不是這樣的XML。我看到了數組的示例,多態屬性和鑑別器,但在我的情況下,我需要有一個AbstractItem集合,這樣我得到一條消息「無法實例化抽象類Com \ AbtsractItem」,如果我的類不是抽象的我只是在xml中得到屬性objectType原因是序列化一個Item,但沒有孩子。

回答

0

嗯,我明白了,

我它的版本,我是使用phpDocumentor的第一個問題,以便爲0.16,如果我刪除了我的phpDocumentor可以更新到1 *,在我的代碼修改:

注:對象部分和補體實現了新的ItemInterface,除去抽象類和擴展

接口文件:

<?php 
namespace Com; 

use JMS\Serializer\Annotation as JMS; 

/** 
* @JMS\Discriminator(
*  field = "objectType", 
*  map = { 
*   "part": "Com\Part", 
*   "complement" : "Com\Complement" 
*   }, 
*  disabled=true 
*) 
*/ 
interface ItemInterface 
{ 
} 

中號y目標文件:

<?php 
namespace Com; 

use JMS\Serializer\Annotation as JMS; 

/** 
* @JMS\XmlRoot("MyObjects") 
*/ 
class MyObject 
{ 
    /** 
    * @JMS\Type("array<Com\ItemInterface>") 
    * @JMS\XmlElement(cdata=false) 
    * @JMS\XmlList(inline=false, entry="item")  
    */ 
    private $items; 
    //getters & setters 
}