Flex SOAP Collection解码

时间:2012-04-02 09:10:06

标签: flex soap flex4.5 decoding

有人知道为什么Flex 4(.6)SOAP解码器在对象中基于属性的数组(集合)的第一个元素中添加解码的arraycollection吗?

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 :(得分:0)

JoriDor,

我回顾了我的步骤,发现我创建的内容与下面引用的样本之间的第二个区别似乎是真正的原因。

我的ArrayCollection实例变量是由getter / setter函数创建的。当我将其更改为公共变量时,如示例代码,它可以工作!这非常令人失望,因为我现在必须考虑改变我的VO课程。

不要太容易放弃,我想mx.rpc.xml类正在使用反射(describeType()),所以也许我可以看到如何更改< accessor>的处理。与<变量>标签

... 30分钟后,感谢Adobe开源Flex ...我发现XMLDecoder.getExistingValue()使用describeType并且确实考虑了getter / setter(又名“accessor”)。我的构造函数创建了一个空的ArrayCollection。好吧,XMLDecoder.setValue不知道是否要替换此AC或向其添加项目。它是后者。移动AC实例直到第一次调用getter(当然检查为null),现在它可以工作了!

我希望能为你解决这个问题。如果你倾向于访问XML Decoder的关键部分:setValue(),getExistingValue(),然后是promoteValueToArray()执行的问题。

<小时/> 撤回部分开始......

我也发现了同样的行为。我不知道这是否算作答案,但我的代码确实有效,取自this site。我能够辨别出我的代码/数据与该站点发布的内容之间的关键区别在于我在模式中声明我的集合/数组的方式。

在我的架构中,我以这种方式声明了一个集合:

<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实例(他和我的),没有什么区别可见。每个集合都由具有复数名称的元素作为父级。那是&lt; Things&gt;有&lt; thing&gt;实例,而&lt; items&gt;有&lt; item&gt;实例

我有兴趣知道您的架构和/或XML实例是什么样的,以及是否更改它以匹配上面的示例(如果您的情况下可以进行架构更改)可以解决问题。

答案 1 :(得分:0)

感谢您的回答!

使属性成为ArrayCollection类型的公共变量似乎有效。 我没有设法让它在getter中实例化字段。

你的意思是这样的吗?

    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解码器。