具有XML反序列化的JMS序列化程序列表多态

时间:2016-04-05 17:06:01

标签: php xml list serialization polymorphism

我需要一些帮助,我有下一个场景:

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集合,这样我得到一条消息&#34;无法实例化抽象类Com \ AbtsractItem&# 34;如果我的课它不抽象我只是在xml原因中得到attribue objectType是序列化一个Item但没有孩子。

1 个答案:

答案 0 :(得分:0)

好吧,我明白了,

我的第一个问题是版本,我使用phpDocumentor所以是0.16,当我删除phpDocumentor时我可以更新到1. *,关于代码我的更改:

注意:对象Part和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
}