Giter VIP home page Giter VIP logo

Comments (5)

Engerim avatar Engerim commented on June 28, 2024

The Serializer Class calls in line 141 the visitor getResult method. Through the ArrayCollectionHandler is the result always set and therefore never the ArrayCollection returned. Possibly the handler should reset the result of the visitor?

// JMS\Serializer\Serializer Line 141
if ((null === $visitorResult = $visitor->getResult()) && null !== $navigatorResult) {
    return $navigatorResult;
}
// JMS\Serializer\Handler\ArrayCollectionHandler Line 53
return new ArrayCollection($visitor->visitArray($data, $type));

from serializer.

mlehner avatar mlehner commented on June 28, 2024

I came across this issue today while making a custom handler for a class similar to ArrayCollection.

I resolved it by cloning the visitor inside my deserialize method, which prevented the original visitor from being filled with the array result of the visitor.

Are there any known issues that would result from cloning the visitor as such?

public function deserialize(VisitorInterface $visitor, $data, array $type, Context $context)
{
    $type['name'] = 'array';

    $myVisitor = clone $visitor;

    return new ScalarParameterMap($myVisitor->visitArray($data, $type, $context));
}

from serializer.

garciall avatar garciall commented on June 28, 2024

@schmittjoh This is happening as of 0.16.0 and @Engerim pointed at the issue already.

from serializer.

AlexSayHello avatar AlexSayHello commented on June 28, 2024

I had the same problem when implementing a handler for my collections.

I realized that the serializer was ignoring the result of my handler because the result of the visitor is not null

// ...jms/serializer/src/JMS/Serializer/Serializer.php
private function handleDeserializeResult($visitorResult, $navigatorResult)
    {
        // This is a special case if the root is handled by a callback on the object itself.
        if (null === $visitorResult && null !== $navigatorResult) {
            return $navigatorResult;
        }

        return $visitorResult;
    }

What I did was re-set the navigator. This makes the result of the visitor set to null

public function deserialize(JsonDeserializationVisitor $visitor, $data, array $type, Context $context)
    {
        /**
         * @var $collection ArrayCollection
         */
        $collection = new $type['name'];
        self::assertValidArrayCollectionSubclass($collection);

        $items = $this->getItems($visitor, $type, $data, $context);

        foreach ($items as $item) {
            $collection->add($item);
        }

        $visitor->setNavigator($visitor->getNavigator());

        return $collection;
    }

from serializer.

goetas avatar goetas commented on June 28, 2024

Fixed in 2.0, now the visitors do not use an internal data representation, but the data are passed always back an forward to the graph navigator and serialized/deserialized with the new SerializationVisitorInterface::getResult($data) and DeserializationVisitorInterface::getResult($data) methods

from serializer.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.