La serialización de as3corelib sale mal

Me sale un error

Error # 2099: el objeto de carga no está lo suficientemente cargado para proporcionar esta información

cuando trato de codificar objetos en JSON usando as3corelib. Logré codificar algún objeto de valor que no tiene padres ni hijos, así que sé que la biblioteca funciona y que el problema podría estar relacionado con addChild o algo así. Eso es solo una suposición.

El tablero se agrega al escenario así:

stage.addChild(board);

Cuando no agrego la placa al escenario y trato de serializarla, aparece un error diferente:

undefined
at XML/http://adobe.com/AS3/2006/builtin::copy()
at global/describeTraits()
at global/avmplus::describeType()
at global/flash.utils::describeType()
    ...

Clase de tablero:

public class Board extends Sprite
{
    public var board:Array;
    public var blockColor:uint = 0xE3E3E3;
    public var blockLength:uint

    public function Board(blockLength:uint)
    {
        super();
        x = 0;
        y = 0;
        this.blockLength = blockLength;
        //buttonMode = true;
        // Setting up two dim array
        board = new Array(10);
        for (var k:int = 0; k < board.length; k++) 
        {
            board[k] = new Array(10);
        }


        for (var i:int = 0; i < 10; ++i) 
        { 
            for(var j:int = 0; j < 10; ++j)
            {
                var block:Block = new Block(i*blockLength, j*blockLength);  
                board[i][j] = block;
                this.addChild(block); // here I add children
                block.drawBlock(blockLength, blockColor);
                block.addEventListener(MouseEvent.CLICK, blockClicked);
            }
        }           
    }

    ....

}

}

Aquí está el código para Block, realmente no hay nada.

public class Block extends Sprite
{

    public var cos:int = 5; // test

    public function Block(x:uint, y:uint)
    {
        ...
    }

    public function drawBlock(length:uint, color:uint):void
    {
        ...
    }
}

¿Alguna pista de por qué es eso?

preguntado el 22 de mayo de 12 a las 14:05

1 Respuestas

Le sugiero que no intente serializar ninguna forma de DisplayObject; en su lugar, solo debe serializar los datos subyacentes (atributos) que utiliza la vista; es difícil darle una respuesta exacta del código anterior, pero considere lo siguiente:

// Simple Model object which represents the BlockView's underlying data.
public class BlockViewModel {
    public var x : Number;
    public var y : Number;
}

// Renders the BlockViewModel on screen.
public class BlockView extends Sprite {
    public var position : BlockViewModel;

    // Constructor requires a BlockViewModel object.
    public function BlockView(position : BlockViewModel) {
        this.position = position;
        draw();
        reposition();
    }

    private function draw() : void {
        // Omitted...
    }

    // Update the block's position based on the model.
    private function reposition() : void {
        this.x = this.position.x;
        this.y = this.position.y;
    }

    // Setter for the block's current position.
    public function setX(value : Number) : void {
        this.position.x = value;
        reposition();
    }
}

Con el ejemplo anterior, simplemente serializaría el BlockViewModel objeto cuando desea guardar el estado, por ejemplo:

var serailizedBlockData : String = JSON.encode(blockView.position);

A continuación, podría volver a crear un nuevo BlockView deserializando los datos:

// Convert from JSON -> Object.
var blockData : Object = JSON.decode(serializedBlockData);

// Create and populate a BlockViewModel with the deserialized data.
var position : BlockViewModel = new BlockViewModel();
position.x = blockData.x;
position.y = blockData.y;

// Create a new view using the serialized data.
var blockView = new BlockView(position);

Puede extender esto aún más moviendo la lógica de construcción/población de objetos a una Método de fábrica para ayudar a separar la lógica.

contestado el 22 de mayo de 12 a las 14:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.