読者です 読者をやめる 読者になる 読者になる

カスタムクラスのシリアライズでコンストラクタに引数があった場合

AIR

http://d.hatena.ne.jp/yuichi_katahira/20110204/1296840804

開発時に得られた技術情報の公開についても快諾いただきましたので、こちらについても順次ブログで公開していきたいと思います。

半年前にこんな事書いてたのですが、その後書いてなかったので、ぼちぼち書いていこうかと思います。


早速本題。
AIRでオブジェクトをローカル保存する場合、AMFがデフォルトで対応してるデータ型は型情報も復元してくれますが、オレオレクラスはそのままだとデコードしたときに、型情報が欠落してしまいます。

こういう場合、registerClassAlias()でクラスのエイリアスを登録しておくと、エンコード時にクラスを維持して、デコードしてもちゃんとクラスを復元出来ます。

registerClassAlias("Account", Account);

しかしオレオレクラスのコンストラクタに引数があると、登録していても失敗してしまいます。

	public class Account {
		private var _name:String;
		private var _age:int;

                //これでは失敗してしまう
		public function Account(name:String, age:int) {
			_name=name;
			_age=age;
		}

		public function get name():String {
			return _name;
		}

		public function set name(value:String):void {
			_name=value;
		}

		public function get age():int {
			return _age;
		}

		public function set age(value:int):void {
			_age=value;
		}
	}

解決方法

	public class Account {
		private var _name:String;
		private var _age:int;

		public function Account(name:String="", age:int=-1) {
			_name=name;
			_age=age;
		}

		public function get name():String {
			return _name;
		}

		public function set name(value:String):void {
			_name=value;
		}

		public function get age():int {
			return _age;
		}

		public function set age(value:int):void {
			_age=value;
		}
	}

デフォルト引数を全て用意しておけば、期待通りに動作します。