AS3自定义对象到ByteArray然后到自定义对象

时间:2010-09-18 09:30:43

标签: actionscript-3 object bytearray

在读取自定义对象的bytearray时遇到问题。任何帮助表示赞赏

public class CustomObject extends Object {
public function CustomObject() {
public var _x:Number =  100
public var _y:Number = 10
public var _z:Number  = 60
}
}

var cObj:CustomObject = new CustomObject()
var bytes:ByteArray = new ByteArray()
bytes.writeObject(cObj)
bytes.compress()

//read
try { bytes.uncompress() } catch (e:Error) { }
var obj:CustomObject = bytes.readObject() as CustomObject

trace(obj) // null why?!
trace(obj._z) // Obviously - TypeError: Error #1009: Cannot access a property or method of a null object reference. 

4 个答案:

答案 0 :(得分:12)

您要做的是使用registerClassAlias方法将类型信息与数据一起注册。这样Flash就会知道如何序列化/反序列化你的对象。以下是Adobe documentation的一些示例代码:

registerClassAlias("com.example.eg", ExampleClass);
var eg1:ExampleClass = new ExampleClass();
var ba:ByteArray = new ByteArray();
ba.writeObject(eg1);
ba.position = 0;
var eg2:* = ba.readObject();
trace(eg2 is ExampleClass); // true

应该注意,必须为要保存的类型信息注册应序列化的所有类型。因此,如果您的类型引用了另一种类型,那么它也必须注册。

答案 1 :(得分:1)

您的CustomObject类是错误的,它实际上应该抛出一个错误,它应该是这个

public class CustomObject 
{
   public var _x:Number =  100
   public var _y:Number = 10
   public var _z:Number  = 60

   public function CustomObject() 
   {
   }
}

编辑:

听起来像macke有一点,因为这有用......


//read
try { bytes.uncompress() } catch (e:Error) { }
var obj:Object = bytes.readObject();

trace(obj) // [object Object]
trace(obj._z) // 60

答案 2 :(得分:0)

查看ByteArray.readObject()返回的对象。您可能会看到所有属性都存在,但类型信息丢失。所以,你可以通过创建一些

来解决这个问题
public static function fromObject(value:Object):CustomObject {
    var result:CustomObject = new CustomObject();
    result._x = value._x;
    //and so on...
    return result;
}

答案 3 :(得分:0)

要将自定义类序列化为ByteArray,必须将registerClassAlias放在调用byteArray.writeObject()函数的类的构造函数中。

如果不这样做,您的自定义类将被序列化为对象类型。我在下面的序列化函数中调用了registerClassAlias,我的自定义类继续被序列化为Object,直到我将registerClassAlias移动到构造函数。

public class MyClass{
    public function MyClass(){
        registerClassAlias("com.myclass", MyClass); // Ok, serializes as MyClass
        serialize( new MyClass() );
    }

    private function serialize( _c:MyClass ){
        var byteArray:ByteArray = new ByteArray();
        byteArray.writeObject( _c );
        //registerClassAlias("com.myclass", MyClass); Not ok, serialized as Object
        EncryptedLocalStorage.setItem('key', byteArray);
    }
}