2016-04-05 10 views
1

ich ein wenig Hilfe brauchen, ich das nächste Szenario haben:JMS Serializer Liste Polymorphe mit XML-Deserialisierung

AbtsractItem Datei:

<?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; 
} 

Teil File:

<?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 
} 

Complement Datei:

<?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 Datei:

<?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 
} 

So erwartete ich so etwas wie das nächste XML:

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

wenn ich serialisiert/deserialisiert in JSON Ich habe nicht Problem, aber nicht wie die für XML. Ich sah die Beispiele für Arrays, für polymorphe Attribute und den Diskriminator, aber in meinem Fall brauche ich eine AbstractItem-Sammlung, auf diese Weise erhalte ich die Nachricht "Kann die abstrakte Klasse Com \ AbtsractItem nicht instanziieren", wenn meine Klasse es ist war nicht abstrakt, ich bekomme nur die attribute objectType in der XML-Ursache ist Serialisierung eines Elements, aber keine der Kinder.

Antwort

0

Nun, ich es,

Mein erstes Problem, das es die Version wurde, ich wurde mit phpDocumentor so betrug 0,16, wenn ich phpDocumentor entferne ich meine Änderungen 1. *, auf dem Code nicht aktualisieren:

Hinweis: Das Objekt Teil und Complement implementiert die neue ItemInterface, die abstrakte Klasse entfernt und erstreckt sich

Schnittstelle Datei:

<?php 
namespace Com; 

use JMS\Serializer\Annotation as JMS; 

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

M y Objektdatei:

<?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 
} 
Verwandte Themen