2016-04-02 11 views
2

JMSSerializerBundleを使用してsymfonyエンティティをJSONにシリアル化しています。私は、以下のクラスの構造を有する:JMSSerializerBundle:@Groupは親の親クラスフィールドでは機能しません

abstract class A {} 
abstract class B extends A {} 
class C extends B {} 

を今私はクラスCのオブジェクトをシリアル化するので、私は新しいグループを定義する、のは「example_group」を言わせて、このような@Groups注釈を設定したいです

abstract class A { 
    /** 
    * @Groups({"example_group"}) 
    */ 
    private $a1; 

    private $a2; 
} 

abstract class B extends A { 
    /** 
    * @Groups({"example_group"}) 
    */ 
    private $b1; 

    private $b2; 
} 

class C extends B { 
    /** 
    * @Groups({"example_group"}) 
    */ 
    private $c1; 
} 

結果のシリアル化にはC::c1フィールドだけでなく、B::b1も含まれますが、驚くことにA::a1ではありません。これは期待される行動ですか?私はA::a1も含める必要があります。それをどうすれば実現できますか?

ありがとうございます。

答えて

0

この3つのクラスにはExclusionPolicyを設定することを忘れないでください。

use JMS\Serializer\Annotation\ExclusionPolicy 

/** 
* @ExclusionPolicy("all") 
*/ 
abstract class A 
{ 
    // ... 
} 

/** 
* @ExclusionPolicy("all") 
*/ 
abstract class B extends A 
{ 
    // ... 
} 

/** 
* @ExclusionPolicy("all") 
*/ 
class C extends B 
{ 
    // ... 
} 

グループexample_groupCをシリアライズすることで、あなたは@Groups注釈を介して公開されているすべてのプロパティを取得する必要があります。

$a1,および$c1がレンダリングされる必要があります。

+0

すべてのクラスの\ @ExclusionPolicy( "all")を宣言すると、直列化したいすべての属性に対して\ @exposeを明示的に宣言しない限り、属性はレンダリングされません。とにかく、私はそうしようとしましたが、私はまだ$ a属性がレンダリングされているのを見ることができません(前と同じ結果、$ bと$ cは正しくレンダリングされます)。私が間違っていない場合、\ @Groupsを使用すると\ @ExclusionPolicyは必要ありません。 –

+0

シリアライザを呼び出すときにグループをどのように設定しますか? – chalasr

+0

これは私がグループを設定する方法です:$ serializer-> serialize($ data、 'json'、SerializationContext :: create() - > setGroups(array( 'example_group')))); –

関連する問題