我需要一点帮助,我有下一个场景:
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集合,这样我会收到一条消息"Cannot instantiate abstractclass Com''AbtractItem",如果我的类不是抽象的,我只会在xml中得到attribue objectType,因为它正在序列化一个Item,但没有子项。
好吧,我明白了,
我的第一个问题是版本,我使用的是phpDocumentor,所以是0.16,当我删除phpDocumentor时,我可以更新到1.*,在代码上我的更改:
注意:对象Part and Complement实现了新的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
{
}
我的对象文件:
<?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
}