Flex SOAP集合解码



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

BarCollection扩展自ArrayCollection

预期:

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

得到:

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

集合通过SchemaTypeRegistry.getInstance().registerCollectionClass-方法

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

感谢您的回答!

将属性设置为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;
    }

但这似乎只适用于纯数组集合。My CustomCollection扩展了CollectionBase,后者扩展了ArrayCollection。如果我切换到自定义集合,而不是ArrayCollection,上面列出的技巧似乎不起作用。

如果有时间,我将再次运行XML解码器。

JoriDor,

我回溯我的步骤,发现我所创造的和我从下面引用的样本中得到的之间的第二个差异似乎是真正的原因。

我的ArrayCollection实例变量是由getter/setter函数创建的。当我把它改成一个公共变量时,就像示例代码一样,它起作用了!这非常令人失望,因为我现在必须考虑更改我的VO类。

为了不太容易放弃,我想象mx.rpc.xml类正在使用反射(describeType()),所以也许我可以看看如何改变<accessor>与<variable>标记。

30分钟后,感谢Adobe开源Flex。。。我发现XMLDecoder.getExistingValue()使用describeType,并考虑getter/setter(又名"访问器")。我的构造函数创建了一个空的ArrayCollection。XMLDecoder.setValue不知道是替换这个AC还是向它添加项。它做的是后者。将AC实例化移动到第一次调用getter(当然是检查null),现在它可以工作了!

我希望这能帮你解决问题。如果你愿意,可以访问XML解码器的关键部分:setValue()、getExistingValue(),然后是promoteValueToArray()执行的问题。


收缩部分开始

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

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

<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实例(他的和我的),没有什么不同。每个集合都由一个具有复数名称的元素作为父级。这是<Things>有<thing>实例,而<items>具有<item>实例。

我很想知道您的模式和/或XML实例是什么样子的,以及更改它以匹配上面的示例(如果您的情况下可以更改模式)是否可以解决这个问题。

最新更新