【发布时间】:2026-02-10 15:35:01
【问题描述】:
如果我从 Zend_Amf 向 Flex 发送远程数据,如果对象上的两个数组属性具有相同的数据值,它们将在远程端使用相同的内存存储进行反序列化。
示例: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)
即:它们引用相同的数组对象。
如果我从远程服务器发送的 2 个数组的值略有不同:
$this->test1 = array("foo", "bar");
$this->test2 = array("bar", "foo");
在 Flex 调试器中,TestVO 对象现在有两个单独的数组,正如您所期望的:
test1 数组(@54cb7e9)
test2 数组(@54cb741)
AMF 输出看起来好的,它总是为 test1/test2 发送两个单独的值,即使它们具有相同的值,所以我猜这是 Flex 反序列化的方式?
有什么想法吗?谢谢。
【问题讨论】:
-
两个具有相同数字的数组以相同的顺序而不是字符串怎么样?字符串是不可变的,数字不是——这意味着所有持有“foo”的字符串变量都指向同一个字符串对象。但是两个持有 3 点的数字变量指向不同的内存位置。
-
是的 - 带有数字的数组也会遇到同样的问题。正如詹姆斯在下面提到的,似乎 AMF3 使用的“压缩”被错误地反序列化。仅仅因为数据相同,就假定这两个引用必须最初与远程端的同一个变量相关,事实并非如此。
标签: apache-flex arrays amf remoteobject