1

what i'm trying to do is walk an object that is also a complex tree of objects and output the actionscript 3 code it took (or takes) to create instantiate and populate that object and all its children.

so for instance if you saw something like this in your debugger

myObjectToParse (ParseMe@173e239)
----------[0]someBlob (SomeBlob@173e322)|null
----------[1]someChildren (Array@173e239)
--------------------[0]childFoo (ChildFoo@123e239)
------------------------------someProperty (Number@173e239) | 45
------------------------------someOtherProperty (Number@173e239) | 45
--------------------[1]childBar (ChildFoo@123e239)
------------------------------someStringProperty(String@173e239) | "hello world"

The exporter would spit out:

public class MySerialized extends ParseMe
{
    public var someBlob:SomeBlob;
    public var someChildren:Array;

    public function MySerialized()
    {
        //populateSomeBlob(); //its null so the export doesn't write it out    
        populateSomeChildren();    
    }

    private function populateSomeChildren()
    {
        someChildren=new Array(2);
        var childFoo:ChildFoo=new ChildFoo();
        childFoo.someProperty=45;
        childFoo.someOtherProperty=45;
        childFoo.someProperty=45;
        childFoo.someOtherProperty=45;

        var childBar=new ChildBar();
        childBar.someStringProperty="hello world";

        someChildren[0]=childFoo;
        someChildren[1]=childBar;
    }
}

Any tips? Ideas? Thanks!

Edit: I think i may end up just trying to serialize to an amf ByteArray...sounds simpler, but i haven't played with and don't know how many levels deep it can go and what types of references it supports.

4

2 に答える 2

4

一般的に、これは不可能です。残念ながら...たとえば、読み取り専用のプロパティがあります...また、一部のクラスのコンストラクターは初期化値を必要とします(個人的には、ほとんどの場合、これはあまり賢明ではないと思いますが、大丈夫です) ...また、一部のオブジェクトはプライベート/内部クラスのインスタンスである可能性があるため、生成されたインスタンス化コードはエラーをスローします...

ただし、これらの問題を抱えていないオブジェクトの解決策を作成することはできます...

わかりました、基本的にflash.utils.describeTypeは非常に役に立ちます...これにより、オブジェクトのすべてのフィールド(読み取り専用フィールドなどがあるかどうかもわかります)とクラス名が表示されます...

これは、オブジェクトのプロパティを反復するのに役立ちます...動的オブジェクトの場合(describeTypeが教えてくれます)、さらにfor-inループを使用してプロパティをループする必要があります...*反復変数の型として使用します。 'Dictionaryたとえば、sでも動作します...

次に、特定の組み込み型を特別に扱う必要があります...

  • XML: use ... これにより、リテラルXML::toXMLStringのベースが得られます...XML
  • Array: ループして、配列リテラルを作成します
  • Number, int, uint, Boolean: リテラルには標準の文字列表現を使用します
  • String: 文字列をエスケープすることを忘れないでください (改行、バックスラッシュなど) ... 最も簡単なのは"unescape('"+escape(yourStringValue)+"');"... もちろん、エスケープ シーケンスを使用して通常のStringリテラルを作成できます ... 最も簡単な方法はcom.adobe.serialization.JSON.serialize(yourStringValue)(as3corelib を使用)
  • Date: 次のようなものを使用"new Date("+yourDateValue.getTime()+");"してください ... 日付をハーコードすることが本当に意味があるかどうかは疑問ですが ...
  • DisplayObjectおよびサブクラス: これは簡単なことではありません。本当にそれが必要な場合は...表示リストの階層を適切に再構築する方法を見つける必要があります...
  • IEventDispatcherおよび実装者: これはまったく不可能です ... に登録されているハンドラーを見つける方法はありませんIEventDispatcher。さらに、関数オブジェクトから ActionScript を生成するのに苦労することになります (まったく不可能です) ... を選択する必要があります。再帰的アプローチ...循環参照をサポートしたい場合、これはより困難になることに注意してください...アルゴリズムを設計する前にその決定を下したいかもしれません...

お役に立てれば ...

挨拶

back2dos

于 2009-07-27T19:09:31.493 に答える
1

flash.utils.describeType()が役立つかもしれません;)

于 2009-07-27T19:02:05.660 に答える