浏览代码

Merge pull request #48 from gordalina/deserialize-child-polymorphic-classes

Allow deserialization of polymorphic classes by class without specifying the type
Johannes 12 年之前
父节点
当前提交
f3e66aa7a8

+ 1 - 1
src/JMS/Serializer/GraphNavigator.php

@@ -180,7 +180,7 @@ final class GraphNavigator
                 /** @var $metadata ClassMetadata */
                 $metadata = $this->metadataFactory->getMetadataForClass($type['name']);
 
-                if ($context instanceof DeserializationContext && ! empty($metadata->discriminatorMap)) {
+                if ($context instanceof DeserializationContext && ! empty($metadata->discriminatorMap) && $type['name'] === $metadata->discriminatorBaseClass) {
                     $metadata = $this->resolveMetadata($context, $data, $metadata);
                 }
 

+ 25 - 0
tests/JMS/Serializer/Tests/Serializer/BaseSerializationTest.php

@@ -685,7 +685,32 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
                 ),
                 'Class is resolved correctly when least supertype is used.'
             );
+
+            $this->assertEquals(
+                new Car(5),
+                $this->deserialize(
+                    $this->getContent('car_without_type'),
+                    'JMS\Serializer\Tests\Fixtures\Discriminator\Car'
+                ),
+                'Class is resolved correctly when concrete sub-class is used and no type is defined.'
+            );
+        }
+    }
+
+    /**
+     * @group polymorphic
+     * @expectedException LogicException
+     */
+    public function testPolymorphicObjectsInvalidDeserialization()
+    {
+        if (!$this->hasDeserializer()) {
+            throw new \LogicException('No deserializer');
         }
+
+        $this->deserialize(
+            $this->getContent('car_without_type'),
+            'JMS\Serializer\Tests\Fixtures\Discriminator\Vehicle'
+        );
     }
 
     abstract protected function getContent($key);

+ 1 - 0
tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php

@@ -86,6 +86,7 @@ class JsonSerializationTest extends BaseSerializationTest
             $outputs['date_time'] = '"2011-08-30T00:00:00+0000"';
             $outputs['date_interval'] = '"PT45M"';
             $outputs['car'] = '{"km":5,"type":"car"}';
+            $outputs['car_without_type'] = '{"km":5}';
         }
 
         if (!isset($outputs[$key])) {

+ 4 - 0
tests/JMS/Serializer/Tests/Serializer/xml/car_without_type.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<result>
+  <km>5</km>
+</result>

+ 1 - 0
tests/JMS/Serializer/Tests/Serializer/yml/car_without_type.yml

@@ -0,0 +1 @@
+km: 5