Декодирование Flex SOAP Collection - PullRequest
0 голосов
/ 02 апреля 2012

Кто-нибудь знает, почему SOAP-декодер Flex 4 (.6) добавляет декодированный набор массивов в первый элемент свойства based (array) в объекте?

BarCollection начинается с ArrayCollection

Ожидаемый:

Object
    -- someProperty:BarCollection
        --[0] item:Foo 
        --[1] item:Foo 

Got:

Object

-- someProperty:BarCollection
    -- [0] ArrayCollection
        --[0] item:Foo 
        --[1] item:Foo

Коллекция зарегистрирована через SchemaTypeRegistry.getInstance (). RegisterCollectionClass -method

SchemaTypeRegistry.getInstance().registerCollectionClass(new QName("http://www.world.com/Foo", "BarCollection"), BarCollection);

Ответы [ 2 ]

0 голосов
/ 23 апреля 2012

Спасибо за ваш ответ!

Делать свойство публичной переменной типа ArrayCollection похоже на работу. Мне не удалось заставить его работать с созданием экземпляра поля в геттере.

Вы имели в виду нечто подобное?

    private var _collection:CustomCollection;

    public function get collection():CustomCollection {
        if(!_collection) 
                 _collection = new CustomCollection()

        return _collection;
    }

    public function set collection(value:CustomCollection):void {
            _collection = value;
    }

Но, похоже, это работает только на чистых коллекциях ArrayCollections. Моя CustomCollection расширяет CollectionBase, который расширяет ArrayCollection. Если я переключаюсь на пользовательскую коллекцию вместо ArrayCollection, перечисленные выше приемы, похоже, не работают.

Если у меня будет какое-то время, я снова запускаю через XML-декодер.

0 голосов
/ 20 апреля 2012

JoriDor,

Я пересмотрел свои шаги и обнаружил, что истинной причиной является второе различие между тем, что я создал, и тем, что я получил из приведенного ниже примера.

Мой экземпляр ArrayCollectionпеременная была создана функциями получения / установки.Когда я изменил его на общедоступную переменную, как пример кода, это сработало!Это очень разочаровывает, так как теперь я должен рассмотреть возможность изменения своих классов VO.

Чтобы не сдаваться слишком легко, я представляю, что классы mx.rpc.xml используют отражение ( descriptionType () ), поэтому, может быть, я увижу, что можно сделать, изменив обработку тегов по сравнению с .

... 30 минут спустя и поблагодарив Adobe за открытый Flex - Ifound XMLDecoder.getExistingValue () использует descriptionType и отвечает за получение / установщик (он же «accessor»).Мой конструктор создал пустой ArrayCollection.Что ж, XMLDecoder.setValue не знает, заменить ли этот AC или добавить к нему элементы.Это делает последнее.Перемещал инстанцирование AC до первого вызова геттера (конечно, проверяя на ноль), и теперь он работает!

Надеюсь, это исправит это для вас.Основные части XML-декодера, которые нужно посетить, если вы склонны: setValue (), getExistingValue (), а затем проблема с решением, которую выполняет promoValueToArray ().

Начало отведенной части ...

Я тоже нахожу такое же поведение.Я не знаю, будет ли это считаться ответом, но у меня есть код, который работает, взятый с этого сайта .Основное различие, которое я могу различить между моим кодом / данными и тем, что публикуется на этом сайте, заключается в способе объявления моей коллекции / массива в схеме.

В моей схеме я объявил коллекцию втаким образом:

<complexType name="Things">
    <sequence>
        <element name="thing" type="ids:Thing" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
</complexType>

<complexType name="ParentThing">
    <complexContent>
        <sequence>
            <element name="things" type="Things"/>
        </sequence>
    <complexContent>
</complexType>

В коде с сайта, на который есть ссылки, коллекция объявляется более прямо:

<xs:complexType name="example">
    <xs:sequence>
        ...
        <xs:element name="items">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="item" type="item" maxOccurs="5"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

(В случае, если вас скинули, "example"тип и элемент в примере кода. Это отбросило меня, когда я исследовал, как работает пример кода (я предпочитаю соглашение только с прописными буквами типов / классов.))

Во всяком случае,пример кода работает, и разница в схеме, казалось, была единственной разницей, которая имела значение.Глядя на экземпляры XML (его и мой), разницы не было.Каждая коллекция имеет элемент с множественным именем.То есть имеет экземпляров, в то время как имеет экземпляров.

Мне было бы интересно узнать, как выглядит ваша схема и / или экземпляр XML и изменяет ли она его для соответствияПриведенный выше пример (если в вашем случае возможны изменения схемы) устраняет проблему.

...