Problem:
When serializing a collection of Doctrine enitities the collection will still have 2 items though the items are empty.
Background:
I have a few entities which extends each other B extends A and C extends B. In the entity Test I have an array with objects of the type B. $test will have the expected values (collection with two items) at the moment of serialization.
$test contains a variable (array) collection one of the items in the array is of the type B and one of type C. 
$sTest will get the collection of two items though the items are empty. 
This is how the string in $sTest lookslike after the serialization of $test "{"collection":[[],[]]}"
Test script:
$test = new Test();
$b = new B();
$b->setToken('asdf');
$b->setName('asdf');
$c = new C();
$c->setToken('asdf');
$c->setName('asdf');
$c->setDescription('asdf');
$test->addCollection($b);
$test->addCollection($c);
//Serialize
$serializer = $this->container->get('serializer');
$sTest = $serializer->serialize($test, 'json');
//Deserialize
$deserializer = $this->container->get('serializer');
$dTest = $deserializer->deserialize($sTest, 'Acme\DemoBundle\Entity\Test', 'json');
$em = $this->getDoctrine()->getManager();
$em->merge($dTest);
$em->flush();
A:
<?php
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"a" = "Acme\DemoBundle\Entity\A", "b" = "Acme\DemoBundle\Entity\B", "c" = "Acme\DemoBundle\Entity\C"})
 * 
 * @JMS\ExclusionPolicy("None")
 * @JMS\Discriminator(field = "type", map = {
 *          "a": "Acme\DemoBundle\Entity\A",
 *          "b": "Acme\DemoBundle\Entity\B",
 *          "c": "Acme\DemoBundle\Entity\C", * 
 *  })
 */
class A {
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $token;
    public function setToken($token){
        $this->token = $token;
    }    
    /**
     * @JMS\VirtualProperty
     * @JMS\SerializedName("type")
     */
    public function getDiscr()
    {
        return 'a';
    }
}
B:
<?php
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
/**
 * @ORM\Entity
 * @JMS\ExclusionPolicy("None")
 */
class B extends A {
    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;
    /**
     * @ORM\ManyToOne(targetEntity="Acme\DemoBundle\Entity\Test", inversedBy="collection")
     * @ORM\JoinColumn(name="TestId", referencedColumnName="id")
     */
    private $test;
    public function setName($name) {
        $this->name = $name;
    }
    /**
     * @JMS\VirtualProperty
     * @JMS\SerializedName("type")
     */
    public function getDiscr() {
        return 'b';
    }
    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set token
     *
     * @param string $token
     * @return B
     */
    public function setToken($token)
    {
        $this->token = $token;
        return $this;
    }
    /**
     * Get token
     *
     * @return string 
     */
    public function getToken()
    {
        return $this->token;
    }
    /**
     * Set test
     *
     * @param \Acme\DemoBundle\Entity\Test $test
     * @return B
     */
    public function setTest(\Acme\DemoBundle\Entity\Test $test = null)
    {
        $this->test = $test;
        return $this;
    }
    /**
     * Get test
     *
     * @return \Acme\DemoBundle\Entity\Test 
     */
    public function getTest()
    {
        return $this->test;
    }
}
C:
<?php
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
/**
 * @ORM\Entity
 * @JMS\ExclusionPolicy("None")
 */
class C extends B {
    /**
     * @ORM\Column(type="text")
     */
    protected $description;
    public function setDescription($description) {
        $this->description = $description;
    }
    /**
     * @JMS\VirtualProperty
     * @JMS\SerializedName("type")
     */
    public function getDiscr() {
        return 'c';
    }
}
Test:
<?php
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
/**
 * @ORM\Entity
 */
class Test {
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\OneToMany(targetEntity="Acme\DemoBundle\Entity\B", mappedBy="test", cascade={"all"})
     * @JMS\Type("ArrayCollection<'Acme\DemoBundle\Entity\B'>")
     */
    private $collection;
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->collection = new \Doctrine\Common\Collections\ArrayCollection();
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Add collection
     *
     * @param \Acme\DemoBundle\Entity\B $collection
     * @return Test
     */
    public function addCollection(\Acme\DemoBundle\Entity\B $collection)
    {
        $this->collection[] = $collection;
        return $this;
    }
    /**
     * Remove collection
     *
     * @param \Acme\DemoBundle\Entity\B $collection
     */
    public function removeCollection(\Acme\DemoBundle\Entity\B $collection)
    {
        $this->collection->removeElement($collection);
    }
    /**
     * Get collection
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getCollection()
    {
        return $this->collection;
    }
}