完全なシリアル化のソリューションにtoSource旋盤問題する。理論Mozillaは、非常に巧妙な方法を開発して完全なシリアル化のソリューションにtoSourceと呼ばれるtoSourceオンに修正します。 toSourceを使うと、バッファには、オブジェクトの状態をシリアル化することが可能です。次の型宣言の例を考えます。 ソース: /サイト/ルート/ Ajaxの記事/ジャバスクリプト/ tosource.html関数DefinedClass()(this.localvalue = 10; this.localmethod =関数(param)は(情報("DefinedClass.localmethod"、"私"と呼ばれる);)) DefinedClassタイプlocalmethodメソッドとlocalvalueデータメンバを定義している時の型、インスタンス化された型がインスタンス化されているということができますtoSourceメソッドは、次のソースコードに示されている。 ソース: /サイト/ルート/ Ajaxの記事/ジャバスクリプト/ tosource.htmlヴァール分類=新しいDefinedClass(); cls.prototypemethod.value = 100;、cls.toSource("mozilla_tosourceの"info()); 時toSourceと呼ばれ、次のバッファが生成されます: (localvalue:10、localmethod:(関数(param)は(情報("DefinedClass.localmethod"、"私)");})と呼ばれる 生成されたバッファのオブジェクトインスタンスの直列化された形式です。直列化からの不明タイプの定義です。ときに、オブジェクトのインスタンスを再作成され、再作成するオブジェクトの状態です。これは、次のプロトタイプ宣言toSourceを逃しているけれども、完全に真実ではないからです。 ソース: /サイト/ルート/ Ajaxの記事/ジャバスクリプト/ tosource.html DefinedClass.prototype.prototypevalue =新しいStaticClass();
何がDefinedClass.prototypeプロパティのtoSource実装で逃している介して宣言されます。場合のtoSourceバッファは、インスタンスが作成された型への参照が含まれている基本的なプロパティとメソッドが見つからない理にかなって。しかし、そこがないメソッドとプロパティを参照せず、任意のブラウザMozilla以上/ Firefoxは、他ではサポートされません。それではtoSourceの利用ですか?自体toSourceメソッドは限られているtoSource良いの背後にあるアイデア。我々は、能力を後に消費のためにオブジェクトをシリアル化したいと後の記事で表示され、シリアル化は、様々なオブジェクトを実装するための鍵であることに、Mixinのような技術指向として、toSourceはMozillaの実装で示すように、シリアル化のさまざまな側面を持つことができます。直列化の実装を開始する前に、シリアル化の別のコンテキストを識別できます: • プレーン、バニラ、シリアル化のような toSource:デフォルトの直列化Mozillaが提供するその他のブラウザでは利用できません。を使用するtoSourceは、これらのWebアプリケーションでは、他のブラウザで実装する必要があります。ではなく、プロトタイプのプロパティをシリアル化するときに便利ではなく、ベースの情報を、追加の情報をシリアル化したいです。 • 完全なインスタンス宣言シリアルときに、すべてのメソッド、プロパティ、およびデータメンバのバッファは、実行時に、完全に再オブジェクトを作成するに変換されます:完全なインスタンスがシリアル化されます。インスタンスが再作成され、その元の型情報が失われます。 • インスタンスの状態をシリアル化:他のシリアル化とは対照的に、状態のシリアル化は、オブジェクトの状態だけを格納するバッファの生成され、関数の宣言が生成されていません。はJavaScript Object Notation(JSON)は、プロトコルインスタンスの状態を専用のシリアル化の例です。場合、データメンバーは、prototypeプロパティで定義されたインスタンスの状態をシリアル化が含まれます。 • 変数の代入をシリアル化:完全なインスタンス宣言をシリアル化が、すべてのオブジェクトのインスタンスの状態に含まれていますので、頻繁に使用されない関数のプロパティが表示されません。場合、関数のプロパティを使用する場合、直列化された状態変数に代入する必要がありますそれ以外の場合、それは非常に難しい関数のプロパティを割り当てます。 • オブジェクト指向のシリアル化:オブジェクト指向のシリアル化は、プレーンなシリアル化の拡張機能です。指向型のシリアル化オブジェクトを定義するための理由は、クラスの分離、特定のデータとインスタンス固有のデータを有効にすることです。 objectorientedシリアル化を使用して、オブジェクトがシリアル化される可能性が再異なるデフォルトの動作で作成された各コンテキストのシリアル化は、特定のフレーバーです。すべてのコンテキストの中で共通する機能は、それらが同じ情報をフィルタアウトは必要でないものをシリアル化されます。たとえば、うちのごく平凡な直列フィルタの任意のプロパティをプロトタイプによって参照されます。状態をシリアル化フィルタを、すべての機能が、反復プロパティのプロトタイプが参照されます。最初のステップとして、ソリューション、我々は一般的な""実装すべてのシリアル化を作成します。フィルタリング機能と出力の生成を制御機能が含まれるすべての実装でシリアル化します。一般的なシリアル化を使用して、シリアル化プロセスの理解がかなりのように、細かいことが可能ですチューニングが必要です。2番目のステップとして、我々は適切なフィルタリングの実装では、特定のシリアル化のコンテキストを実装します。 すべてのシリアル化は、オブジェクトのインスタンスに格納されているすべてを反復処理し、意味の場合、その情報をシリアル化するために、OKされ、その後は、呼び出し元を求めた。高レベルから、として実装されているすべての関数をシリアル化します。で、機能の2つの透明度の目的のためにカットされているコメントが記載されて、すべての機能をシリアル化する / /わかりやすくするため削除されました。 ソース: /サイト/ルート/スクリプト/ common.jsシリアル:(objをコールバック)(ヴァールバッファ機能="(";ヴァールカンマ=関数()(カンマ=関数()(戻り"、";))を返す"";)ヴァールquoteProperties ="";ヴァールcanProcessFilter =関数()(trueを返す;)ヴァールfunctionPropertyCallback =関数()()ヴァールcallingStack;場合(typeof演算(引数[2])=="")(callingStack =新しいアレイ定義() ; callingStack.push("分類");)他(callingStack =引数[2];))の場合(コールバック)(/ /わかりやすくするため)objに(プロパティ)(に削除された場合(canProcessFilter(OBJの[プロパティ]、objは、プロパティ))((OBJの[プロパティ]))(/ /わかりやすくするため)))バッファを削除+ =")";リターンバッファ;)(typeof演算スイッチ この関数は2つのパラメータがありますが、シリアル、特定のコンテキスト(後述)が3番目のパラメータです。としては関数を使用する人々を混同しないように3番目のパラメータはオフに放置されています。最初のパラメータは、objは、そのシリアル化されているオブジェクトのインスタンスを表します。 2番目のパラメータは、コールバックは、そのときに、データをシリアル化と呼ばれているカスタマイズの方法を表します。までのループは、キーワードは、変数が初期化されますを使用して開始されます。彼らのように定義は以下の通り: •バッファ:この変数はシリアライズされたオブジェクトを表すの完全なテキストを作成するために使用されます。 •カンマ区切り:この変数は、技術資料2-7のかどうかをカンマときには、JavaScriptオブジェクトの直列化形式で作成する必要であると判断を示したように使用します。参考までに、シリアライズされたオブジェクトの形式では、各プロパティの宣言(prop1(例:場合はtrue、prop2:偽))は、カンマを使用して分離されます。この関数は、しかし、すべての呼び出しに対して、その後には、カンマが必要ですテクニックどこに呼ばれるのは初めてのカンマが必要です実装しています資料2-7、意思決定のブロックとフラグのテクニックを使用しない場合に必要となる。 •quoteProperties:この変数を表すかどうかは、バッファが二重引用符が含まれます。見積り時にJSON形式にオブジェクトをシリアル化されます。 •canProcessFilter:この変数は、各プロパティの値と呼ばれる関数をコールバックされますが見つかりました。コールバックのいずれかのプロパティを無視するようにプロパティまたはfalseをシリアル化する場合はtrueを返します。直列化されてコールバックの3つのパラメータ:プロパティは、実際のプロパティを参照; objをオブジェクトを持って、そしてpropertyIdentifierは、プロパティの文字列識別子です。 •functionPropertyCallback:この変数は、関数のプロパティを反復処理と呼ばれる関数をコールバックされます。これは、シリアル化された形式の関数のプロパティの定義を許可しない場合は、関数のプロパティは、バッファの変数に格納することはできません。関数のプロパティは、シリアル化されたJavaScriptのオブジェクトのバッファの定義の後に割り当てる必要があります。このため、JavaScriptのオブジェクトの完全なシリアル化変数の定義が必要です。 •callingStack:場合(例えば、variable.embeddedobj。function.value)は、シリアライズされたオブジェクト参照が必要な関数のプロパティを別のJavaScriptオブジェクトの宣言内に埋め込まれた割り当てます。は、スタックの参照を作成するには、ここでは、スタック内の各要素のオブジェクト参照が使用されます。宣言の後には、オブジェクトのプロパティ(の反復処理されます(property. ..)ループインチの詳細を説明する前にループを、私は不足しているコールバックの初期化をカバーします。 ソース: /サイト/ルート/スクリプト/ common.js場合(コールバック)(場合(callbacks.canProcessFilter)(canProcessFilter = callbacks.canProcessFilter;))の場合(callbacks.functionPropertyCallback)(functionPropertyCallback = callbacks.functionPropertyCallback;))の場合(callbacks.variablename)( callingStack.pop();(callbacks.variablename)callingStack.push;))の場合(callbacks.quoteProperties)(場合(callbacks.quoteProperties ==がtrue)(quoteProperties ="\"";))) シリアル化の呼び出し元のコールバックのための価値を提供する必要はありません。値がない場合提供されて、すべての既定のシリアル化は、関数のプロパティを除くものとみなされます。理由は、関数に関連付けるには関数のプロパティにシリアル化されたJavaScriptのオブジェクト形式の方法はない関数のプロパティはシリアル化されていません。コードの詳細すぐに説明されます。直列4つのコールバック関数があります: •canProcessFilter:かどうかをプロパティにシリアル化されることが決定するために使用されます。 •functionPropertyCallback:たびに、関数をプロパティにシリアル化されたときに呼び出されます。 •VariableNameは:変数の識別子は、変数には、シリアル化が生成されますさを表します。 •quoteProperties:値がtrueの場合は、プロパティの識別子を囲む引用符を生成するセットを表します。通常、これはJSON形式のシリアル化形式を生成使用されて、今、我々は初期化の詳細を見ている、のは、シリアル化のロジックを検討する上で移動することができます。ループは、オブジェクトのインスタンスをシリアル化すると、ループの詳細は省略されている責任がある。この段階で、私は全体的な戦略について説明するには、JavaScriptでは、各メソッドとデータメンバオブジェクトには、次の表記法を使用してアクセスすることができます: obj.datamember = ... この記法は、ソースコードを書くことは、メソッドまたはデータメンバにアクセスするための最も一般的な方法です。これは、プログラマは、個々のメソッドとデータメンバが何であるか知っていると予想されるシリアル化の目的については有用ではない、表記されます。シリアル化の目的のために、反射が必要です。 JavaScriptでの反射は、2段階のプロセスです: 1。 文字列値をプロパティ識別子列挙体を使用してご利用いただけますとobj(プロパティ))(例えば、ループを使用して反復。 2。 実際のプロパティは、配列には、オブジェクトのインスタンスと、インデックスが配列の表記を使ってアクセスされている文字列値をプロパティの識別子(例えば、objは[プロパティ])です。 場合は、プロパティには、canProcessFilterコールバック関数を呼び出すことによってシリアル化する必要がありますとして、各プロパティは、シリアル化の最初のクエリを繰り返している。場合は、プロパティをシリアル化することができますし、switch文と呼ばれるには、プロパティのテストを入力します。として定義されるシリアル化されませんする必要がありますtypeof演算関数を返し、これの5つの関心がある6つの識別子は、(私は未定義に)興味がない。 switch文の詳細は以下のとおり。 ソース: /サイト/ルート/スクリプト/ common.js"ブール値(typeof演算(OBJの[プロパティ]))(場合、"スイッチ:バッファ+ =カンマ区切り()+ quoteProperties +プロパティ+ quoteProperties +":"+オブジェクトの[プロパティ];ブレーク;場合、"関数":バッファ+ =カンマ区切り()+ quoteProperties +プロパティ+ quoteProperties +":"+ OBJの[プロパティ]();(プロパティ); functionPropertyCallback(OBJの[プロパティ] callingStack.push toString戻り、objは、プロパティ、コールバック、callingStack); callingStack.pop();ブレーク;場合は"number":バッファ+ =カンマ区切り()+ quoteProperties +プロパティ+ quoteProperties +":"+ OBJの[プロパティ];ブレーク;場合は、"オブジェクト":callingStack.push(プロパティ);バッファ+ =カンマ区切り()+ quoteProperties +プロパティ+ quoteProperties +":"+"の場合、"文字列(OBJの[プロパティ]、コールバック、callingStack); callingStack.pop();ブレーク; ops.serialize:バッファ+ =カンマ区切り()+ quoteProperties +プロパティ+ quoteProperties +":"+オブジェクトの[プロパティ];ブレーク;) switch文の実装では、型を数値、文字列、およびboolean型の単純なシリアル化実装している。これらの型のシリアル化規約[プロパティ識別子]:[プロパティの値に従う]。関数とオブジェクトのより複雑です。際オブジェクトが検出されると、埋め込まれたJavaScriptオブジェクトのシリアル化が発生し、ops.serialization関数を再帰的に呼び出されます。シリアル化の結果は、バッファには、呼び出し元に返されることに追加されたプロパティ値です。中括弧を追加するシリアル化を封鎖して、呼び出し元に生成されたバッファを返すserialize関数の残りの部分。提示シリアル化が完了すると、それぞれのコンテキストの独自の生成されたバッファを生成するためには、シリアル化関数を使用します。のを見てみましょうこれは、Mozilla toSourceシリアル模倣Serializer.toSource関数の実装です。これは、任意の関数やデータメンバは、prototypeプロパティの一部として定義されて処理されていないということです。何を求められているかどうかは、プロパティフィルタを使用してシリアル化されるかを決定することです。 Serializer.toSourceの完全な実装を次のとおり。 ソース: /サイト/ルート/スクリプト/ jaxson / commons.js Serializer.toSource =関数(OBJの)(戻りops.serialize(objを(currProcessedObject:nullのiterPrototype:nullのcanProcessFilter:(プロパティは、currObj、propertyIdentifier)関数は、(場合( )(GetPrototypeObject(currObj、関数(プロトタイプ)(this.iterPrototype =プロトタイプ;)); this.currProcessed!= currObj this.currProcessed = currObj;(prototypeIdentifier用)の場合(typeof演算(iterPrototype)=="オブジェクト")(でiterPrototype)(場合(prototypeIdentifier == propertyIdentifier)(falseを返す;)))trueを返す;)));) シリアル化の実装では。 toSource、単一のメソッド呼び出しは、それops.serializeすることです。デフォルトでは、すべてシリアル化するだろうし、ops.serializeは避けるべきである。インスタンスのプロパティとプロパティは、prototypeプロパティによって定義されて区別できるようにするには、canProcessFilterの実装のプロパティは、インスタンスと関連づけて把握する必要があります。 canProcessFilterメソッドの実装でGetPrototypeObjectへの参照です。 GetPrototypeObject利便性のprototypeプロパティは、オブジェクトに関連付けられて取得するために使用される関数です。私はまもなくGetPrototypeObjectの実装をカバー。現時点では、のどのようなフィルタで発生に焦点を当てることができます。が呼び出されたときops.serializeは、オブジェクトtoSerializeのプロパティを反復処理します。プロパティが取得され、ユーザ定義のフィルタcanFilterProcess関数が呼び出されます。として2番目のパラメータは、オブジェクトには、すぐにすることが直列化プロパティに属しているcanFilterProcessしています。 ソース: /サイト/ルート/スクリプト/ jaxson / commons.js)(場合((obj.constructor)=="関数")(ヴァールfuncMatch = typeof演算GetPrototypeObject(objをコールバック関数 /関数\秒(.*)\(/;ヴァール結果=()(funcMatch)一致する場合、(結果=がnull)(場合((コールバック)=="関数")(ヴァールiterobj; typeof演算の場合(typeof演算(結果[1])obj.constructor.toString =="文字列")(("ヴァールprototypePropery ="+結果[1] +"。プロトタイプeval;");コールバック(prototypePropery、結果[1]);))))) GetPrototypeObjectは、最初のテストの実装では、obj.constructorプロパティが実際に存在することの検証です。場合は、関数が存在しない場合は、そこにはコンストラクタであり、必要がない継続することです。場合は、関数が存在しない場合、正規表現関数名を抽出するために使用されます。コード例では、正規表現を太字で表示されているスラッシュのための正規表現として認識されるとき、文字列のコンテキスト内で正規表現を使用して、一致する関数が呼び出されると返すと一致した結果である。がある場合の結果、そのときは識別子を参照するためのprototypeプロパティを使用することができることを発見です。しかし、テキストバッファではなく、オブジェクトが検出されます。テキストバッファをオブジェクトに変換されるために、evalステートメントを使用しています。動的に実行されるバッファは、ローカルに参照するには、prototypeプロパティprototypePropertyを宣言した。その後、コードブロックを使用して、オブジェクトのプロパティと識別子は、呼び出し元に渡されますが割り当てられます。もう1つのコンテキストだけの状態としない機能が含まれてオブジェクトのインスタンスのシリアル化されます。まだコードを見てなければ、おそらくフィルタ何を推測することができます。フィルタのコードのテストの場合は、プロパティフィルタする関数オブジェクトです。このプロパティは関数オブジェクトである場合は、プロパティをフィルタリングすることはありません。そして、実際には、どのようにフィルタコードが書かれているとして、次のリストに表示されます。 ソース: /サイト/ルート/スクリプト/ jaxson / commons.js Serializer.toSourceState =関数(OBJの)(戻りops.serialize(objを(canProcessFilter:(プロパティは、objは、propertyIdentifier)関数は、( 場合は((プロパティ)=="関数")typeof演算(復帰はfalse;)他(trueを返す;))));) 太字のコードのタイプをテストするには、typeof演算子を使用してオブジェクトを示します。もう1つのコンテキストをJSONの表記に状態のシリアル化されます。 JSONにシリアル化状態にシリアル化するように、そのプロパティ識別子を引用符で囲むている点が異なります。シリアル化コードの状態をシリアル化コードには、quotePropertiesデータメンバがtrueに設定されて除いて同じです。 ソース: /サイト/ルート/スクリプト/ jaxson / commons.js Serializer.toSourceJSON =関数(OBJの)(戻りops.serialize(objを( quoteProperties:trueの場合、canProcessFilter:(場合(typeof演算(プロパティ)=="関数")(falseを返す;)他(trueを返す;))))(プロパティは、objは、propertyIdentifier)関数;) 前述の3つのシリアル化のコンテキストを検討した後、おそらくそのコードが比較的似ているが、結果は非常に異なっている考えています。参照して連載していますこのように、コードブロックは、特定の処理をより一般的な繰り返し区切るために使用することができますの例です。もう1つのシリアル化コンテキストの場合は、toSourceに似ていますが使用されます。このシリアル化のコンテキストは次のとおりです。どこのタイプの基本的な機能として機能するシステムを作成している。インスタンスの型を終えた後、カスタマイズが実行されます。次に、オブジェクトのシリアル化を決定するが、あなたは、その理由は、オブジェクトを再されている別のコンピュータまたはプログラム上で作成されるだけのカスタマイズをシリアル化する場合は、別の基本機能が欲しい使用される。したがって、同じクラスの別の基本機能で動作することができます。この問題を解決し、プロトタイプのプロパティをシリアル化しないようには、その型のインスタンスは、バッファが生成されます。 注意してください 彼らは新しいテクニックを説明しています私は他のシリアル化コンテキストの種類の実装は説明しません。私はどのように異なるコンテキストに、より複雑なフィルタコードでGetPrototypeObjectを使用してカバー。場合はさらに、/ウェブサイト/ルート/ Ajaxの記事をファイルにテストコードを見て学ぶことに興味があるなら/ javascriptに/ tosource.htmlして、テストメソッドjaxson_tosource_oo特定インチJavaScriptでのシリアル化を簡単なものと思われると、toSourceメソッドは非常に便利だ。しかし、この記事では、toSourceで議論が不完全です。するときに念頭に置いてシリアル化するためのJavaScriptコードは、次の点に書き込む: •シリアルJavaScriptには、JavaScriptオブジェクトの形式でフォーマットされたバッファを生成するための手段。 •この資料では、どのように再シリアライズされたオブジェクトの作成を見ていない。ので、これだけはevalステートメントには、バッファを渡す必要との結果を代入を行うこれは、 変数はeval。 •シリアル化には多くの異なるコンテキスト。関数ops.serializeは非常に一般的なシリアル化が必要な特殊なことを実装します。 •時のシリアル化は、型情報です。型情報を持ってするには、あなたはそれを抽出し、次にどこかに格納する必要があります。は、JavaScriptはプロトタイプですベースのプログラミング言語、およびJavaScriptの型をコンセプトにするときはC言語の型に比べて異なっているのです#とJava。 この記事のシリアル化技術•どのように特定のコンテキストのコードブロックからの一般的な繰り返しコードブロックを別々のコードブロックを使用するアルゴリズムを定義する方法を示します。 記事は、ソニアLandeを提出 免責事項:弊社のウェブサイトは、この資料の内容については責任を負いません。 Webarticles無料の情報リソースです。 重要: この記事は、"完全なシリアル化ソリューション"の自動ソフトウェアによって翻訳されたにtoSource旋盤。大変申し訳ございませんが発生した可能性があります任意のスペルミスを感じている。お客様のご理解いただき、ありがとうございます。
|
|||||
| Online: 273 users browsing the articles directory |
|
|