schmittjoh / serializer

Library for (de-)serializing data of any complexity (supports JSON, and XML)
http://jmsyst.com/libs/serializer
MIT License
2.32k stars 586 forks source link

XmlList(skipWhenEmpty=true) or @SkipWhenEmpty() does not work #847

Closed martinpfeiferdev closed 6 years ago

martinpfeiferdev commented 6 years ago

Hello,

I am trying to deserializer an arraycollection, however this attribute is optional, but the following error occurs: "Warning: JMS \ Serializer \ XmlDeserializationVisitor :: visitProperty (): Node no longer exists"


namespace Presentation\DataTransferObject;

use Doctrine\Common\Collections\ArrayCollection;
use JMS\Serializer\Annotation as A;
use Presentation\DataTransferObject\ListTest;

/**
 * @A\XmlRoot("Test")
 */
class Test
{
   /**
     * @var ListTest
     * @A\Type("ArrayCollection<Presentation\DataTransferObject\ListTest>")
     * @A\SkipWhenEmpty()
     * @A\XmlList(skipWhenEmpty=true,entry = "Presentation\DataTransferObject\ListTest")
     */
    private $ListTest;
}

Is there any way to when it is empty, it does not deserialize?

goetas commented 6 years ago

are you using a custom error handler? which serializer version are you using?

martinpfeiferdev commented 6 years ago

@goetas "jms/serializer-bundle": "^2.2"

martinpfeiferdev commented 6 years ago

@goetas I am not using an error handler

goetas commented 6 years ago

what about the serializer library?

martinpfeiferdev commented 6 years ago

@goetas I have not manipulated anything, I am using a jms library natively

goetas commented 6 years ago

@A\XmlList(skipWhenEmpty=true,entry = "Presentation\DataTransferObject\ListTest")

"entry" is not a valid name, can not contain \

goetas commented 6 years ago

can you also share your input xml?

martinpfeiferdev commented 6 years ago

@goetas look my xml send


<TestSend xmlns="http://www.abrasf.org.br/nfse.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="nfse.xsd">
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
            <SignedInfo>
                <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                <Reference>
                    <Transforms>
                        <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
            <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                    </Transforms>
                    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                    <DigestValue>XvbrFJoDCHFJ7q38XdMYngy45Kg=</DigestValue>
                </Reference>
            </SignedInfo>
           <SignatureValue>D5rBP99TUNQElWSvbc2DTHeJcq8typCZzMkzsH0A5k8Pt1ZHQOLKJB0wLyqH0FzSakxCZ/BdLUrBOQAIQrAWf0DniNJUre2GAe05q/oCgv9albG3vtAh+RWwjHkaU16V2SQOQUBYjfZOXMCtXw/MiiOLdVRzhaLKIBxO/9yCLvZuu40zd4Vr42IF2KepQF5zLIT2MW+Yz4uULkTrO3wX96Jk9bo1vGqf5jic7qZUT1TdTcr7ZfYiIeTyevnUvGGdXPBmG6kzr+CGhjgHaZBUtr7FWQ67mzDi9t23hyG+grxJ/Lndh0Bq8w/uQJlPRVLqIwTUsNYycXi4dG3sZiekCw==
            </SignatureValue>
            <KeyInfo>
                <X509Data>
                    <X509SubjectName>CN=SONNER SISTEMAS DE INFORMATICA LTDA,OU=(EM BRANCO),OU=(EM BRANCO),OU=(EM BRANCO),OU=(EM BRANCO),OU=(EM BRANCO),OU=000001002911048,OU=(EM BRANCO),O=ICP-Brasil,C=BR
                    </X509SubjectName>
                    <X509Certificate>
                    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
                    </X509Certificate>
                </X509Data>
            </KeyInfo>
        </Signature>
</TestSend>
martinpfeiferdev commented 6 years ago

@goetas my class php...


namespace Presentation\DataTransferObject;

use Doctrine\Common\Collections\ArrayCollection;
use JMS\Serializer\Annotation as A;
use Presentation\DataTransferObject\Signature\Signature;

/**
 * @A\XmlRoot("TestSend")
 */
class TestSend
{
    /**
     * @var ArrayCollection
     * @A\Type("ArrayCollection<Presentation\DataTransferObject\ListTest>")
     * @A\SkipWhenEmpty()
     * @A\XmlList(skipWhenEmpty=true, inline=true, entry="child::*")
     */
    private $ListTest;

    /**
     * @var Signature
     * @A\Type("Presentation\DataTransferObject\Signature\Signature")
     * @A\SkipWhenEmpty()
     * @A\XmlList(skipWhenEmpty=true, entry = "Signature")
     */
    private $Signature;

    /**
     * @return ArrayCollection
     */
    public function getListTest(): ArrayCollection
    {
        return $this->ListTest;
    }

    /**
     * @return Signature
     */
    public function getSignature(): Signature
    {
        return $this->Signature;
    }
}

I'm going to send the Signature class, it can only be deserialized if using XmlList.

martinpfeiferdev commented 6 years ago

@goetas


namespace Presentation\DataTransferObject\Signature;

use JMS\Serializer\Annotation as A;

/**
 * @A\XmlNamespace(uri="http://www.w3.org/2001/XMLSchema")
 * @A\XmlNamespace(uri="http://www.w3.org/2000/09/xmldsig#", prefix="ds")
 */
class Signature
{
    /**
     * @var SignedInfo
     * @A\Type("Presentation\DataTransferObject\Signature\SignedInfo")
     * @A\XmlElement(cdata=false, namespace="http://www.w3.org/2000/09/xmldsig#")
     */
    private $SignedInfo;

    /**
     * @var string
     * @A\Type("string")
     * @A\XmlElement(cdata=false, namespace="http://www.w3.org/2000/09/xmldsig#")
     */
    private $SignatureValue;

    /**
     * @var KeyInfo
     * @A\Type("Presentation\DataTransferObject\Signature\KeyInfo")
     * @A\XmlElement(cdata=false, namespace="http://www.w3.org/2000/09/xmldsig#")
     */
    private $KeyInfo;

    /**
     * @return SignedInfo
     */
    public function getSignedInfo(): SignedInfo
    {
        return $this->SignedInfo;
    }

    /**
     * @return string
     */
    public function getSignatureValue(): string
    {
        return $this->SignatureValue;
    }

    /**
     * @return KeyInfo
     */
    public function getKeyInfo(): KeyInfo
    {
        return $this->KeyInfo;
    }
}
martinpfeiferdev commented 6 years ago

@goetas Is there a better way to show the code, or can it be right here?

martinpfeiferdev commented 6 years ago

@goetas Another point is that Signature, I can only deserialize if I remove the inline.

goetas commented 6 years ago

to higlight the code you can use

```php for php 

```xml for xml
```js for javascript
... and so on

more info on https://help.github.com/articles/creating-and-highlighting-code-blocks/

martinpfeiferdev commented 6 years ago

@goetas Is there any way to deserialize an XmlList, if it is null?

goetas commented 6 years ago
martinpfeiferdev commented 6 years ago

@goetas I think I was doing it the wrong way, excuse me.

The solution I managed to deserialize the Signature was like this:

martinpfeiferdev commented 6 years ago

@goetas Many thanks for your proactivity.

goetas commented 6 years ago

:+1: