【问题标题】:Flex RemoteObject: Arrays with same values reference same memoryFlex RemoteObject:具有相同值的数组引用相同的内存
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 感谢您的解释。看起来像 Flash/Flex 端的错误 - 客户端不应该在解压缩时创建单独的数据值吗?
【解决方案2】:

在 Zend Framework 的 AMF 实现中发现错误 ZF-7634。它正在错误地序列化数组。

http://framework.zend.com/issues/browse/ZF-7634

【讨论】: