2009-11-11 57 views
2

如果我将远程数据从Zend_Amf发送到Flex,如果对象上的两个数组属性具有相同的数据值,那么它们将在远端使用相同的内存存储进行反序列化。Flex RemoteObject:具有相同值的数组引用相同的内存

示例:AS3对象:

段:

[RemoteClass(alias="TestVO")] 
public class TestVO 
{ 
    public var test1:Array; 
    public var test2:Array; 
} 

当这个从Zend_Amf服务器接收远程数据,如果阵列的数据是相同的它分配同一存储到两个阵列。

如:从远程(ZendAMF)对象我送:

$this->test1 = array("foo", "bar"); 
$this->test2 = array("foo", "bar"); 

当我调试的Flex调试器TestVO对象,我得到:

test1的阵列(@ 597d779)
TEST2阵列(@ 597d779)

ie:它们引用相同的数组对象。

如果我从远程服务器发送针对2个阵列略微不同的值:

$这 - > TEST1 =阵列( “foo” 的 “条”);
$ this-> test2 = array(“bar”,“foo”);

在Flex调试器TestVO对象现在有两个独立的数组正如你所期望:

test1的阵列(@ 54cb7e9)
test2的阵列(@ 54cb741)

AMF输出看起来好吧,即使它们具有相同的值,它总是会为test1/test2发送两个独立的值,所以我猜这是Flex解​​序列化它的方式?

任何想法?谢谢。

+0

如何两个阵列在相同的顺序,而不是字符串相同的数字?字符串是不可变的,数字不是 - 所有持有“foo”的字符串变量指向同一个字符串对象。但是两个数字变量持有3点到不同的内存位置。 – Amarghosh 2009-11-11 12:25:00

+0

是的 - 有数字的数组遇到同样的问题。 正如詹姆斯在下面提到的那样,似乎AMF3使用的“压缩”被错误地反序列化。仅仅因为数据是相同的,它假定两个引用必须最初与远程端上的相同变量相关,但情况并非如此。 – NigelF 2009-11-12 10:54:33

回答

2

AMF这样做是为了在电线上获得一些压缩。如果你不想要这个,那么你可以切换到AMF0格式而不是AMF3格式。但我不知道如何与ZendAMF做到这一点。

+0

感谢您的解释。 貌似对Flash/Flex端的错误 - 不应该在客户端上解压缩创建单独的数据值? – NigelF 2009-11-11 14:13:34