跨类型NSData发送时数据丢失

时间:2012-05-03 00:45:04

标签: iphone objective-c encoding nsdata decoding

我目前正在实施我的游戏的网络层,我正在取得进展但是我遇到了一些非常奇怪的东西,我希望有人可以放弃一些可能:

在发送数据之前我将其编码为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->牌)。

如果有人能够对此有所启发,我会非常感激

非常感谢

1 个答案:

答案 0 :(得分:0)

tl; dr,使用NSCoding序列化您的对象。

你不能发送指向不同进程的指针,因为指针在另一方面都是错误的。

让我们说在发送机器上,你有这个:

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

这表示NSArray *对象的内存块从内存地址0xDEADBEEF开始。这一点都是正确的。

现在,您将0xDEADBEEF指针发送到另一台计算机。计算机获取指针,但0xDEADBEEF处的内存在另一台计算机上没有NSArray 。在该内存区域中可能存在任何。你发送了一个指针,但实际上并没有发送任何数据。

长话短说,只需使用NSCoder进行序列化,因为它非常好。