【问题标题】:JMS Serializer List Polymorphic with XML Deserialization带有 XML 反序列化的 JMS 序列化程序列表多态
【发布时间】: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


    【解决方案1】:

    我明白了,

    我的第一个问题是版本,我使用的是 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
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多