2012-05-03 34 views
0

我目前正在執行我的遊戲的網絡層,但我正在取得進展,但我遇到了一些非常奇怪的事情,我希望有人可以擺脫一些可能:通過類型NSData發送時數據丟失

發送我的數據跨越我正在其編碼爲類型NSData的前(message.cards = [MovePlayer beginEncodeMyCards:myCards]),然後將其分配給一個指針(message.cards)

MessageMove message; 
message.message.messageType = kMessageTypeMove; 
/**/message.cards = [MovePlayer beginEncodeMyCards:myCards];/**/ 
NSData *data = [NSData dataWithBytes:&message length:sizeof(message)]; 

如果我做所有客戶端解碼如下:

MessageMove *myMessage = (MessageMove *) [data bytes]; 
/**/myCards = [MovePlayer beginDecodeMyCards:myMessage->cards cardArray:myCards];/**/ 

一切工作正常,我能夠解碼myMessage->卡,但是當我嘗試做同樣的遠程發送對象後,我可以看到正確的消息類型(kMessageTypeMove),但不卡數據(myMessage->卡)。

如果任何人都可以請一些啓發到這一點,我將不勝感激

千恩萬謝

回答

0

TL;博士,使用NSCoding到您的序列化對象。

您不能發送指向不同進程的指針,因爲指針在另一端都是錯誤的。

比方說在發送機器上,你有這樣的:

NSLog(@"cards: %p", message.cards); 
//prints "cards: 0xDEADBEEF" 

這說的內存爲NSArray的塊*對象開始指向的內存地址0xDEADBEEF。在這一點上這是完全正確的。

現在,您將0xDEADBEEF指針發送到另一臺計算機。計算機獲取指針,但內存位於0xDEADBEEF的另一臺計算機中沒有NSArray。在該內存區域中可能有任何東西。你發送了一個指針,但你實際上沒有發送任何數據。

長話短說,只是使用NSCoder進行序列化,因爲它非常好。

+0

感謝您的回覆,你有我可以遵循的例子嗎? – godzilla

+0

事實證明,我正在做的是在beginEncode內引用的序列化,此方法返回一個指向包含我的卡片信息的NSData的指針。我仍然不確定我如何發送整個值而不僅僅是指針.... – godzilla

+0

基本上,不要這樣做:'[NSData dataWithBytes:&message length:sizeof(message)]''。這樣做:'[NSKeyedArchiver archivedDataWithRootObject:message]'。 –