使用writeObject()发送数组

时间:2011-12-23 09:05:40

标签: actionscript-3 adobe air

目前我正在使用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;
        }

        }
    }
}

3 个答案:

答案 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成员的默认机制进行序列化   只要。因此,类的私有,内部和受保护成员   将无法使用。