【发布时间】:2016-07-25 18:31:19
【问题描述】:
我需要一点帮助,我有下一个场景:
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
}
我的对象文件:
<?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 但没有子级。
【问题讨论】:
标签: php xml list serialization polymorphism