Comunidad de diseño web y desarrollo en internet online

Error #1063: Argument count mismatch usando readobject AIR

Citar            
MensajeEscrito el 13 Oct 2008 01:02 am
Buenas, estoy serializando y deserializando objetos en AMF que grabo usando write/readobject (en AIR). Pero tengo un problema.

Supongamos que tengo mi clase (sin ningun parametro en el constructor):

Código :

   public class MyClass {
      
      public function MyClass():void {
         
      }
      
   }


creo un ArrayCollection de instancias de esa clase, lo grabo y los recupero sin ningun problema.
Ahora, si esa misma clase usa un parametro en el constructor, digamos un string, y la grabo (grabando un arraycollection de instancias de esa clase)cuando trato de deserializar mi objeto arraycollection previamente guardado:

Código :

var file:File = File.applicationDirectory.resolvePath('Data.data');
         var stream:FileStream = new FileStream();
         stream.open(file, FileMode.READ);
         var myAC:ArrayCollection = new ArrayCollection();
         while(stream.bytesAvailable){
         documentLayoutsarr = stream.readObject() as ArrayCollection;//ERROR Error #1063: Argument count mismatch                }


Sinceramente no entiendo. Si alguien puede dar una mano, se agradece..

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 13 Oct 2008 11:15 am
No me pasa. Con éste código me funciona bien:

Código ActionScript :

import mx.collections.ArrayCollection;
         import MyClass;
         private function init ():void
         {
            var arr:ArrayCollection = new ArrayCollection ();
            arr.addItem(new MyClass("uno"));
            arr.addItem(new MyClass("dos"));
            arr.addItem(new MyClass("tres"));
            arr.addItem(new MyClass("cuatro"));
            var ba:ByteArray = new ByteArray ();
            ba.writeObject(arr);
            ba.position = 0;
            var arr2:ArrayCollection = ba.readObject() as ArrayCollection;
            trace (arr2);
            var dos:MyClass = arr2.getItemAt(1) as MyClass;
            trace (arr2.getItemAt(1).str);
         }

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 Oct 2008 12:12 pm
ZAH, MUCHAS GRACIAS por la ayuda. No lo solucione, pero estoy empezando a ver por donde viene el tema. Y me parece que es un bug.. (podra ser?). Cuando trate de reproducir el error con tu ejemplo, tampoco tuve problemas. Hasta que agregue algo.
Mi clase (siguiendo tu ejemplo):

Código :

package {
   public class MyClass {
      public function MyClass(mystring:String) {         
      }
   }
}


Como se graba y lee:

Código :

private function onInit():void{      
            var arr:ArrayCollection = new ArrayCollection ();
            var obj1:MyClass = new MyClass('uno');
            var obj2:MyClass = new MyClass('dos');
            var obj3:MyClass = new MyClass('tres');
            var obj4:MyClass = new MyClass('cuatro');
            
            arr.addItem(obj1);
            arr.addItem(obj2);
            arr.addItem(obj3);
            arr.addItem(obj4);             
            
            var file:File = File.applicationStorageDirectory.resolvePath('test.data');
            var stream:FileStream = new FileStream();
            stream.open(file, FileMode.WRITE);
            stream.writeObject(arr);
            stream.close(); //Se graba como AC, sin problemas
            
            var streamR:FileStream = new FileStream();
            streamR.open(file, FileMode.READ);
            var arrnew:ArrayCollection = new ArrayCollection();
            while(streamR.bytesAvailable){
               arrnew = streamR.readObject() as ArrayCollection;   
               trace(arrnew); //se lee como AC sin problemas..
            }
            streamR.close(); 
}


Ahora, en realidad mi clase, utiliza el tag [RemoteClass] (y bindable), para poder recuperar el tipo una vez leida. O sea, mi clase es asi:

Código :

package {
   [Bindable]
   [RemoteClass(alias='MyClass')]
   public class MyClass {
      public function MyClass(mystring:String) {         
      }
   }
}


En este caso, al intentar grabar y leer.. aparece el error. Alguna idea?

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 13 Oct 2008 02:38 pm
Ya veo... Sí que parece un bug.

Para solucionarlo, ponles valores por defecto a los parámetros del constructor, como:

Código ActionScript :

public function MyClass(mystring:String = ""){}

Realmente no cambia nada, y mantiene las propiedades que tenía antes.

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 Oct 2008 03:07 pm
Parece seriamente un bug [ADOBE: me gane algo? :? ]. Postee el problema en varios lugares y no encuentro mucho mas..
El problema es que no puedo recibir valores por defecto, porque algunos parametros son otros objetos.. y no deberían poder ser null..

A este punto, lamentablemente tengo que reconsiderar como persistir mis objetos, asi que estoy viendo de usar sqllite..
Por cierto, algun bug conocido ya en sqllite-AIR como para que no me tome de sorpresa?

Muchas Gracias por la ayuda.

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 13 Oct 2008 03:12 pm
A ver, en mis pruebas, los valores por defecto solucionan el problema, pero no intervienen realmente en el objeto. Es decir, esto funciona:

Código ActionScript :

import mx.collections.ArrayCollection;
         import MyClass;
         private function init ():void
         {
            var arr:ArrayCollection = new ArrayCollection ();
            arr.addItem(new MyClass("uno"));
            arr.addItem(new MyClass("dos"));
            arr.addItem(new MyClass("tres"));
            arr.addItem(new MyClass("cuatro"));
            var ba:ByteArray = new ByteArray ();
            ba.writeObject(arr);
            ba.position = 0;
            var arr2:ArrayCollection = ba.readObject() as ArrayCollection;
            trace (arr2);
            var dos:MyClass = arr2.getItemAt(1) as MyClass;
            trace (arr2.getItemAt(1).str);


Output:

Código :

[object MyClass],[object MyClass],[object MyClass],[object MyClass]
dos


Con la clase

Código ActionScript :

package
{
   [Bindable]
   [RemoteClass(alias='MyClass')]
   public class MyClass
   {
      public var str:String
      public function MyClass(str:String = "")
      {
         this.str = str;
      }

   }
}


El segundo trace no devuelve una cadena vacía, sino "dos".

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 Oct 2008 03:49 pm
Entendi perfectamente tu ejemplo. Pero lo que quería explicar es que esa clase no deberia poder nunca tener un valor null como parametro, ya que recibe otros objetos como parametros, precisamente otros arraycollections. No me 'convencia' tener que usar valores por defecto en el constructor, se entiende?

Me puse a investigar, opciones de overloading de constructor en AS3 (no existe nativamente) y me encontre con la opcion de '(rest) parameters'. Y con eso no tuvo problemas :?

En resumen, mi clase ahora quedo asi:

Código :

package {
   [Bindable]
   [RemoteClass(alias='MyClass')]
   public class MyClass {
      public function MyClass(...args) {         
//En args tengo un array con el que puedo recorrer los parametros que se pasaron y verificar si no son null, etc.
      }
   }
}

Esta casi para un tutorial, no? :)
Gracias MIL por la ayuda.

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 13 Oct 2008 05:37 pm
[Actualización]
Cante victoria antes de tiempo.. el 'args' no me resolvio nada, estaba probando con una versión anterior cuando crei q funcionaba...
En fin, lo investigo un poco mas antes de resignarme a sqllite..

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 13 Oct 2008 05:49 pm
Y tanto cuesta hacer un if(parametro == null){throw new Error ("se requiere un parámetro")}

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 Oct 2008 06:08 pm
Mucha razon..
Por cierto, lo intente, pero no se si la sintaxis es correcta.. es correcto esto?:

Código :

package {
   [Bindable]
   [RemoteClass(alias='MyClass')]
   public class MyClass {
      public function MyClass(mystring:String, myAC1:ArrayCollection = null, myAC2:ArrayCollection = null) {         
      }
   }
}

Porque eso me sigue devolviendo el mismo error :oops:

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 13 Oct 2008 07:12 pm
Yo no veo que dé error. ¿Has importado mx.collections.ArrayCollection a tu clase?

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 Oct 2008 09:07 pm
Bueno, volvi a probarlo.. y pareciera que esta funcionando. El problema me lo daba con otra clase, que ya tenia parametros por default. Pero al instanciarla no estaba obviamente pasando esos parametros..
Agregando null y string vacios en todas las ocasiones, tanto antes de grabar, como al leer, funciona (por el momento, usando default values en todas las clases que necesite grabar y recuperar).



Por cierto, como se te ocurrio que pudiera servir los default values?

Por selecters75

51 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 13 Oct 2008 09:35 pm
Pues el error decía que la clase necesitaba parámetros... si se los das por defecto no es necesario ponerlos explícitamente, así que podría ser eso. Igual, para la próxima vez, ya sabes, usa clases sin parámetros en el constructor, y te ahorrarás esos problemas.

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.