La serialización de as3corelib sale mal
Frecuentes
Visto 204 veces
0
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?
1 Respuestas
1
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 json actionscript-3 flash or haz tu propia pregunta.