目前我正在使用stage3D开展基于回合制的多人游戏。当服务器发送一个对象时,例如下面的代码,一切都在客户端非常顺利。
package models
{
public class Player
{
public var type:String = "player";
private var _action:String;
private var _id:int;
private var _username:String;
private var _nickname:String;
public function Player()
{
}
public function get id():int
{
return _id;
}
public function set id(value:int):void
{
_id = value;
}
public function get username():String
{
return _username;
}
public function set username(value:String):void
{
_username = value;
}
public function get nickname():String
{
return _nickname;
}
public function set nickname(value:String):void
{
_nickname = value;
}
public function get action():String
{
return _action;
}
public function set action(value:String):void
{
_action = value;
}
public function toString():String
{
return("id: " + id + " username: " + username + " nickname: " + nickname + "");
}
}
}
但是当我在对象中放入一个数组时,数组总是返回长度为0.现在我有点选择了。我用了registerClassAlias
package models
{
/**
* ...
* @author RB
*/
public class ListOfPlayers
{
public var type:String = "list_of_players";
private var _list:Array = new Array();
public function ListOfPlayers()
{
}
public function remove(i:int):void
{
_list.slice(i);
}
public function add(player:Player):void
{
_list.push(player);
}
public function get list():Array
{
return _list;
}
}
}
}
答案 0 :(得分:0)
您是否尝试为阵列添加公共设置器?我认为这是你的问题
答案 1 :(得分:0)
您可以在SharedObject中发布实际存储和检索Player类的代码吗?仔细检查Flash Player的SO默认大小限制。 。 。它可能会关闭,或者太小(这对个人用户来说是一个问题,所以你必须验证最终游戏的FP的SO大小设置。)
答案 2 :(得分:0)
简短回答 - 您应该将数组声明为public,或者实现flash.utils.IExternalizable接口(readExternal()和writeExternal()方法)。
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/IExternalizable.html
IExternalizable接口提供对类的序列化的控制,因为它被编码到数据流中。 IExternalizable接口的writeExternal()和readExternal()方法由类实现,以允许自定义对象及其超类型的数据流(但不是类名或类型)的内容和格式。每个单独的类必须序列化并重建其实例的状态。这些方法必须与超类型对称以保存其状态。这些方法取代了本机Action Message Format(AMF)序列化行为。
如果一个类没有实现,也没有继承自哪个类 实现,IExternalizable接口,然后是一个实例 class将使用public成员的默认机制进行序列化 只要。因此,类的私有,内部和受保护成员 将无法使用。