2011-02-22 34 views
0

我需要通過NetConnection發送複雜類型的對象(在Flex中標記爲RemoteClass)到其他客戶端。如何通過NetConnection將複雜類型轉發給FMS?

[RemoteClass] 
public class ComplexType 
{ 
    public var _someString:String; 
    public var _someInt:int; 
} 

...和使用...

_nc = new NetConnection(); 
_nc.connect("rtmp://localhost/echo/"); 
_nc.addEventListener(NetStatusEvent.NET_STATUS, _onNetStatus);    
_nc.client = {}; 
_nc.client.echoCallback = _echoCallback; 

var dto:ComplexType = new ComplexType(); 
dto._someInt = 4; 
dto._someString = "abrakadabra";      
_nc.call("echo", null, dto); 

但是現在看來,在服務器端該回調函數不明白強類型對象,併發回本:

private function _echoCallback(...args):void 
{ 
    trace(ObjectUtil.toString(args)); 
    /* 

    (Array)#0 
     [0] (Object)#1 
     _someInt = 4 
     _someString = "abrakadabra" 

    */ 
} 

服務器端看起來像這樣:

application.onAppStart = function() { 
    trace("Application.onAppStart > application started"); 

    Client.prototype.echo = function (complexType /*ComplexType*/) { 
     trace("Client.echo > calling echo");   
     application.broadcastMsg("echoCallback", complexType); 
    } 
} 

有沒有辦法通過NetConnection轉發強類型對象?

EDIT1:添加回調函數的源代碼與ObjectUtil.toString()輸出

+0

請問您的服務器AS「知道」之類的,你要發送?類文件必須包含在兩端才能解析ComplexType。 – weltraumpirat 2011-02-22 19:03:10

+0

如何在FMS 4中定義自定義類?我只想傳遞對象。 – 2011-02-22 23:29:26

回答

1

爲了發送使用:

var ba:ByteArray = new ByteArray(); 
ba.writeObject(dto); 

_nc.call("echo", null, ba); 

和用於接收:

private function _echoCallback(ba:ByteArray):void 
{ 
    var dto:ComplexType = ba.readObject() as ComplexType; 

    trace(ObjectUtil.toString(dto)); 

    /* 
    (ComplexType)#0 
     _someInt = 4 
     _someString = "abrakadabra" 
    */ 
} 

它woooorks !!! !

+0

這隻適用於你已經知道什麼類型的期望。如果你有大量的數據會怎麼樣? – weltraumpirat 2011-02-23 00:20:21

1

你需要一個alias屬性添加到您的[RemoteClass]註釋:

[RemoteClass(alias="my.unique.Class")] 

這應該匿名對象更改爲AMF類型化對象。