Dependant objects are only included if they are not singleton and the property is not annotated transient. Afterwards it can reconstitute the objects from the array.
    /**
     * @test
     */
    public function serializeObjectAsPropertyArrayForDoctrineCollectionPropertyBuildsTheCorrectArrayStructureAndStoresEveryObjectInsideSeparately()
    {
        $propertyClassName1 = 'DummyClass' . md5(uniqid(mt_rand(), true));
        $propertyClassName2 = 'DummyClass' . md5(uniqid(mt_rand(), true));
        eval('class ' . $propertyClassName1 . ' {}');
        eval('class ' . $propertyClassName2 . ' {}');
        $propertyClass1 = new $propertyClassName1();
        $propertyClass2 = new $propertyClassName2();
        $className = 'DummyClass' . md5(uniqid(mt_rand(), true));
        eval('class ' . $className . ' {
			private $collectionProperty;

			public function __construct($object1, $object2) {
				$this->collectionProperty = new \\Doctrine\\Common\\Collections\\ArrayCollection();
				$this->collectionProperty->add($object1);
				$this->collectionProperty->add($object2);
			}

			public function getCollectionProperty() {
				return $this->collectionProperty;
			}
		}');
        $mockReflectionService = $this->getMockBuilder(ReflectionService::class)->disableOriginalConstructor()->getMock();
        $mockReflectionService->expects($this->at(0))->method('getClassPropertyNames')->with($className)->will($this->returnValue(['collectionProperty']));
        $mockReflectionService->expects($this->at(1))->method('getClassPropertyNames')->will($this->returnValue([]));
        $mockReflectionService->expects($this->at(2))->method('getClassPropertyNames')->will($this->returnValue([]));
        $mockReflectionService->expects($this->at(3))->method('getClassPropertyNames')->will($this->returnValue([]));
        $mockReflectionService->expects($this->any())->method('isPropertyTaggedWith')->with($className, 'collectionProperty', 'transient')->will($this->returnValue(false));
        $objectSerializer = new ObjectSerializer($this->getMockBuilder(SessionInterface::class)->disableOriginalConstructor()->getMock());
        $objectSerializer->injectReflectionService($mockReflectionService);
        $objectHash1 = spl_object_hash($propertyClass1);
        $objectHash2 = spl_object_hash($propertyClass2);
        $object = new $className($propertyClass1, $propertyClass2);
        $expectedArray = [$objectHash1 => [ObjectSerializer::CLASSNAME => $propertyClassName1, ObjectSerializer::PROPERTIES => []], $objectHash2 => [ObjectSerializer::CLASSNAME => $propertyClassName2, ObjectSerializer::PROPERTIES => []], spl_object_hash($object) => [ObjectSerializer::CLASSNAME => $className, ObjectSerializer::PROPERTIES => ['collectionProperty' => [ObjectSerializer::TYPE => 'Collection', ObjectSerializer::CLASSNAME => 'Doctrine\\Common\\Collections\\ArrayCollection', ObjectSerializer::VALUE => [$objectHash1, $objectHash2]]]]];
        $this->assertEquals($expectedArray, $objectSerializer->serializeObjectAsPropertyArray($object));
    }