在读取自定义对象的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.
答案 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);
}
}