2009-11-11 58 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