私が知っているとを理解に注力したいもののJISTは、直列化復元は、プロパティが設定されている場合、コンストラクタは、呼び出されたのFlex 3でどのように発生するか、バイナリの詳細については、民間のメンバーがシリアライズされているか、すべてのデシリアライズが発生しましたセッターなどを通して?私はこれに関する情報を見つけるのに苦労している。Flexでバイナリオブジェクトをデシリアライズするときに、オブジェクトの初期化はどのように行われますか?
Flex 3 AIRアプリケーションでは、かなり複雑なオブジェクトグラフ(1つの呼び出しを使用してファイルにシリアライズするより複雑なものを除いて大きなデータモデルのような、オブジェクトグラフ全体をシリアライズおよびデシリアライズするルートオブジェクトのFileStream.writeObjectおよびreadObjectに追加します。
私は、彼らがArrayCollectionのの一部であった場合は逆シリアル化するとき、私は、オブジェクト上の例外になるだろう他に、常にデフォルトコンストラクタを持つことが必要なことがわかりました。だから私はコンストラクタのパラメータを減らしたり、デフォルト値を設定しなければなりませんでした。私は今、このようなmConnectionは、すべての情報は、関数への接続のために本当にnecesaryあるので、それは私は、これはすべてのコンストラクタに詰めていた以前と異なるセッターを介して、必要とするいくつかの情報を蓄積する場所を以下のように、私のクラスでは、このような多くのセッターを持っています:
class Client
{
private var mConnection:Connection;
public function get connection():Connection{ return mConnection; }
public var mUser:User;
public function get user():User { return mUser; }
public function set user(value:User):void
{
mUser = value;
mConnection.username = user.username;
mConnection.password = user.password;
}
private var mServer:Server;
public function get server():Server { return mServer;}
public function set server(value:Server):void
{
mServer = value;
mConnection.serverIP = value.serverIP;
}
public function Client()
{
mConnection = new Connection();
}
}
public class Server
{
[Bindable]
public var Clients:ClientsCollection = new ClientsCollection();//contains Client type
private var mServerIP:String;
public function get serverIP():String { return mServerIP; }
public function set serverIP(value:String):void
{
mServerIP = value;
serverName = mServerIP;
}
public var serverName:String;
public function Server(serverIP:String = "")
{
this.serverIP = serverIP;
}
}
これはほとんどの場合、シリアル化を追加する前に問題なく動作しているようです。アプリケーションが終了すると、オブジェクトグラフがシリアル化され、アプリケーションが開いたときに逆シリアル化されます。
シリアル化を追加すると、デシリアライズ後にmConnectionが空の文字列を持つことがあり、時にはシリアル化されたIPアドレスを持つことがあるという問題が発生します。何が起こっているかは、オブジェクトが異なる順序で直列化復元され、オブジェクトがさまざまな順序でプロパティに割り当てられることがあるということが分かります。だから、私はオブジェクトグラフを直列化するときに、サーバーと接続のインスタンスへの参照と、デシリアライズ中のイベントの1つのシーケンス(readObjectへの単一回の呼び出し)が、クライアントのisntanceを持っているとしましょう:
- 接続が構築されます。
- 接続のプロパティは、デシリアライズされた値で設定されます。
- サーバーはデフォルトのコンストラクターで構成されています(serverIPには空の文字列があります)
- サーバー値は、サーバーIPを「127.0.0.1」またはそれ以外のものに復元して設定します。
- クライアントが構築されました
- クライアントのサーバープロパティが以前に構築されたサーバーインスタンスに割り当てられ、このセッターを介して接続のserverIP値が設定されます。このシナリオでは
、接続は正しいサーバのIPを持っています。私は一見無作為に見えますが、以下が時々起こっているため、デシリアライズが完了した後に接続のserverIpが空の文字列になることがあります。
- 接続が構築されます。
- 接続のプロパティは、デシリアライズされた値で設定されます。
- クライアントが構成されて
- サーバデフォルトコンストラクタで構成されているクライアントのサーバプロパティが空の文字列に設定する接続のサーバIP値を引き起こし、以前に構成されたサーバーインスタンスに割り当てられている
- (サーバIPのための空の文字列を有します)このセッターを介して。
- サーバー値は、サーバーIPを「127.0.0.1」またはそれが何であったものにも復元して、セッターによってデシリアライズおよび設定されます。
したがって、サーバーが完全に初期化される前にサーバーがクライアントのプロパティに割り当てられたため、接続のserverIPは空の文字列です。
おそらくバインディングを使用してサーバーのserveripの更新が接続にバインドされている可能性がありますが、バインディングプロパティはかなり複雑です(mxmlのUIでは本当にシンプルですブラケット構文ですが、コードで行うのは複雑です)。また、コンストラクタのパラメータを完全に削除してデフォルト値が存在しない場合もあるケースを解決しました。それ以外は、オブジェクトグラフをどのように再構築するかについて、バイナリの直列化の詳細をより深く理解する必要があります。私は循環参照を持っていても、オブジェクトを複製せずにそれらを細かく処理し、複数の参照を維持するようです。私のコンストラクター/セッターがより複雑で、デシリアライズ時に発生するものの順序のためにこれらの問題にぶつかっているのです。しかし、実際には矛盾しています。さまざまな場所でブレークポイントを追加すると、状況が発生する順序に影響を与え、デバッグが難しくなります。
私はConnectionというクラスをシリアル化しているので、トピックを横断する可能性がある人のための副紙に。いくつかのことに対処するためのコードを追加しました.Connectionクラスのように、Socketのインスタンスがあります。私のオブジェクト・グラフをシリアル化する前に、私はソケットを閉じて、Connectionクラスの参照をnullに設定します。そうすることで、オブジェクト・グラフを直列化する前に、アプリケーション・オブジェクトを閉じて再オープンした後にソケットを接続しません。ソケットへの参照が長くなり、シリアル化されません。次のアプリケーションの実行時にデシリアライズした後、私は新しいソケットを作成します。サイドノートの