(57)【要約】  ストリーミングトークンのセット内のトークンをブックマークすることであり、各トークンは、インスタンス化命令またはインスタンス化のコンテキストを表す。ナビゲータは、ストリーミングトークンのセットを受信して、そのトークンをインスタンス化マネージャに渡す。しかしながら、ナビゲータが特定のトークンをブックマークする命令を受信した場合、ナビゲータは、少なくともそのブックマークされるトークンから開始される（先行するブックマークがあった場合、さらに前のトークンから開始される可能性がある）ストリーミング命令のセットをバッファリングする。ナビゲータは、インスタンス化マネージャからの命令に応じてブックマークから開始されるストリーミングトークンのセットを再生する。インスタンス化マネージャは、ストリーミングトークンのセットを受信する。インスタンス化マネージャが特定のトークンの命令を現在処理できない場合、インスタンス化マネージャは、ナビゲータにその特定のトークンをブックマークするように命令する。インスタンス化マネージャが、その後、インスタンス化マネージャがブックマークに戻ることを可能するトークンを受信すると、インスタンス化マネージャは、ブックマークに戻って、そのブックマークから開始されるインスタンス化命令を再生する。
2011510419.tif 000002
【特許請求の範囲】
【請求項１】
ストリーミングトークンのセット（２０３）をインスタンス化マネージャ（２１３）に渡すストリーミングトークンのナビゲータ（２１２）に関する方法であって、前記ストリーミングトークンのセットは、一群のインスタンス化命令を表し、
インスタンス化命令を表す特定のトークンを受信する（３０３）ナビゲータの動作と、
前記特定のトークンを前記インスタンス化マネージャに最初に渡す（動作３０６）ナビゲータの動作と、
前記インスタンス化マネージャからの、前記特定のトークンにおいて前記ストリーミングトークンのセットをブックマークする要求を受信する（４０１）ナビゲータの動作であって、前記ブックマークは、前記ナビゲータが少なくとも前記特定のトークンから開始される前記ストリーミングデータのセットをバッファリングすることを示す動作と、
前記ストリーミングトークンのセットの１または複数の後続のトークンを受信する（３０３）ナビゲータの動作と、
前記特定のトークンおよび前記１または複数の後続のトークンをバッファリングする（３０５）ナビゲータの動作と、
前記１または複数の後続のトークンを前記インスタンス化マネージャに最初に渡す（３０６）ナビゲータの動作と、
前記ナビゲータが前記１または複数の後続のトークンを前記インスタンス化マネージャに渡した後、前記インスタンス化マネージャからの、前記特定のトークンから開始される前記ストリーミングトークンのセットを再生する要求を受信する（５０１）ナビゲータの動作と、
前記インスタンス化マネージャからの再生の要求に応じて、前記特定のトークンおよび前記１または複数の後続のトークンを、前記ストリーミングトークンのセットにおいてそれらを適切に順序付けて前記インスタンス化マネージャに対して再生する（５０２）ナビゲータの動作と、
を備えることを特徴とする方法。
【請求項２】
前記特定のトークンは、前記ストリーミングトークンのセットの第１トークンであることを特徴とする請求項１に記載の方法。
【請求項３】
前記特定のトークンは、前記ストリーミングトークンのセットの中間トークンであることを特徴とする請求項１に記載の方法。
【請求項４】
前記特定のトークンを前記インスタンス化マネージャに最初に渡すナビゲータの動作の前に、
先行するトークンを前記ストリーミングトークンのセット内で受信するナビゲータの動作と、
前記先行するトークンを前記インスタンス化マネージャに最初に渡すナビゲータの動作と、
前記インスタンス化マネージャからの、前記先行するトークンにおいて前記ストリーミングデータのセットをブックマークする要求を受信するナビゲータの動作であって、前記ブックマークは、ナビゲータが少なくとも前記先行するトークンから開始されてバッファリングすることを示す動作と、
前記先行するトークン、および、トークンの前記ストリーム内で前記先行するトークンと前記特定のトークンとの間に介在する任意のトークンをバッファリングするナビゲータの動作と
をさらに備えることを特徴とする請求項３に記載の方法。
【請求項５】
前記特定のトークンおよび前記１または複数の後続のトークンを再生するナビゲータの動作の後に、
前記インスタンス化マネージャからの、前記先行するトークンから開始される前記ストリーミングトークンのセットを再生する要求を受信するナビゲータの動作と、
前記インスタンス化マネージャからの、前記先行するトークンから開始される前記ストリーミングトークンのセットを再生する前記要求に応じて、前記先行するトークン、前記先行するトークンと前記特定のトークンとの間に介在する任意のトークン、前記特定のトークン、および前記１または複数の後続のトークンを前記インスタンス化マネージャに対して再生するナビゲータの動作と、
をさらに備えることを特徴とする請求項４に記載の方法。
【請求項６】
前記先行するトークンから開始される前記ストリーミングトークンのセットを再生する動作の後および／または同時に、
前記先行するトークン、前記先行するトークンと前記特定のトークンとの間に介在する任意のトークン、前記特定のトークン、および前記１または複数の後続のトークンが含まれたバッファを解放する動作
をさらに備えることを特徴とする請求項５に記載の方法。
【請求項７】
前記特定のトークンから開始される前記ストリーミングトークンのセットを再生する動作の後および／または同時に、
前記先行するトークン、前記先行するトークンと前記特定のトークンとの間に介在する任意のトークン、前記特定のトークン、および前記１または複数の後続のトークンが含まれたバッファを解放する動作
をさらに備えることを特徴とする請求項１に記載の方法。
【請求項８】
トークンのストリーミング時にトークンのセットを受信するナビゲータ（２１２）から、前記トークンのセット（２０３）を受信するインスタンス化マネージャ（２１３）に関する方法であって、前記トークンのセットは、一群のインスタンス化命令を表し、
トークンのストリーミング時に前記トークンのセットを受信するように構成されたナビゲータから前記トークンのセットの特定のトークンを受信する（６０１）インスタンス化マネージャの動作であって、前記特定のトークンは、インスタンス化命令を表す動作と、
前記インスタンス化マネージャが、前記特定のトークンによって表されたインスタンス化命令に対してまだ動作することができないと判断する（６０２）インスタンス化マネージャの動作と、
前記ナビゲータに前記特定のトークンにおいて前記トークンのセットをブックマークするように命令する（６０３）インスタンス化マネージャの動作と、
前記ナビゲータから前記トークンのセットの１または複数の後続のトークンを受信する（６０１）インスタンス化マネージャの動作と、
前記１または複数の後続のトークンの最後のトークンが、前記インスタンス化マネージャに、前記特定のトークンによって表されたインスタンス化命令に対して動作することを可能にすると判断する（６０２、６０３、６０５）動作と、
前記特定のブックマークされたトークンから開始される前記トークンのセットを再生する（６０６）動作と、
を備えることを特徴とする方法。
【請求項９】
前記トークンのセット内の各トークンは、マークアップ言語文書の一部を備えることを特徴とする請求項８に記載の方法。
【請求項１０】
前記特定のトークンは、特定のクラスのオブジェクトをインスタンス化する命令を表し、前記インスタンス化マネージャが前記特定のトークンによって表された前記インスタンス化命令に対してまだ動作することができないと判断するインスタンス化マネージャの前記動作は、
前記特定のクラスのオブジェクトを割り当てることができる前に必要な１または複数の情報項目があると判断する動作
を備えることを特徴とする請求項８に記載の方法。
【請求項１１】
前記特定のクラスは標準クラスであり、前記１または複数の情報項目は、少なくとも前記標準クラスの固有のクラスが識別されることを可能にする型引数を備えることを特徴とする請求項１０に記載の方法。
【請求項１２】
前記１または複数の情報項目は、少なくとも１または複数のコンストラクタ引数を備えることを特徴とする請求項１０に記載の方法。
【請求項１３】
前記ストリーミングトークンの各セットはインスタンス化のコンテキストを表すが、前記ストリーミングトークンのすべてのセットがインスタンス化命令を表すわけではないことを特徴とする請求項８に記載の方法。
【請求項１４】
前記特定のブックマークされたトークンから開始される前記トークンのセットを再生する動作は、
前記ナビゲータに前記特定のトークンから開始される前記トークンのセットを再生するように命令するインスタンス化マネージャの動作と、
前記特定のトークンから開始される前記トークンのセットの再生を前記ナビゲータから受信するインスタンス化マネージャの動作と、
前記インスタンス化マネージャが前記特定のトークンから開始される前記トークンのセットの再生を受信すると、前記ナビゲータから受信したインスタンス化命令に従うインスタンス化マネージャの動作と
を備えることを特徴とする請求項８に記載の方法。
【請求項１５】
前記ナビゲータは、すべての前記トークンのセットよりも少ない数をバッファリングすることを特徴とする請求項８に記載の方法。
【請求項１６】
１または複数のコンピュータ可読媒体を備えるコンピュータプログラム製品（１０４）であって、コンピュータシステム（１００）の１または複数のプロセッサ（１０２）によって実行されると、前記コンピュータシステムにナビゲータ（２１２）およびインスタンス化マネージャ（２１３）をインスタンス化させるコンピュータ実行可能命令をその媒体上に有し、
前記ナビゲータは、ストリーミングトークンのセット（１１２）を受信して、前記ストリーミングトークンのセット（２０３）を前記インスタンス化マネージャに渡すように構成され、さらに、前記ストリーミングトークンのセットをストリーミングロケーションのセットの中にブックマークするように構成され、さらに、ブックマークから開始される前記ストリーミングトークンのセットを再生するように構成され、
前記インスタンス化マネージャは、前記ナビゲータから受信した各トークンに対して、
前記受信したトークンによって表されたインスタンス化命令を現在実行できるか否かを判断する（６０２）こと、
前記インスタンス化命令を現在実行できる場合、前記インスタンス化命令を実行する（６０３）こと、
前記インスタンス化命令を現在実行できない場合、前記ナビゲータに前記トークンをブックマークするように命令（６０８）し、前記ナビゲータに前記ブックマークされたトークンによって表された前記インスタンス化命令を実行することを可能にする後続のトークンを受信する（６０２）と、前記ブックマークされたトークンによって表された前記インスタンス化命令を実行（６０３）して、前記ストリーミングトークンのセット内で前記後続のトークンを再生する（６０６）こと、
を行うように構成されることを特徴とするコンピュータプログラム製品。
【請求項１７】
前記１または複数のコンピュータ可読媒体は、物理メモリおよび／または記憶媒体であることを特徴とする請求項１６に記載のコンピュータプログラム製品。
【請求項１８】
前記ナビゲータは、前記インスタンス化マネージャからのブックマーク命令に応じて、バッファを制御して、前記トークンのセットのすべてのトークンよりも少ない数でバッファリングできるようにさらに構成されることを特徴とする請求項１６に記載のコンピュータプログラム製品。
【請求項１９】
前記インスタンス化マネージャは、一群のクラス定義にアクセスできることを特徴とする請求項１６に記載のコンピュータプログラム製品。
【請求項２０】
前記コンピュータ可読媒体は、その媒体上に前記クラス定義をさらに有することを特徴とする請求項１６に記載のコンピュータプログラム製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストリーミングオブジェクトのインスタンス化に関する。
【背景技術】
【０００２】
オブジェクトインスタンスは、ストリーミングデータから生成できる。例えば、オブジェクトのインスタンス化マネージャは、さまざまなクラス定義にアクセスできる。ストリーミングデータは、インスタンス化マネージャに特定のクラスのオブジェクトをインスタンス化させる命令を渡す。ストリーミングデータは、さらに、それらのオブジェクトをインスタンス化する方法およびポピュレート（populate）する方法についての命令を渡す。バッファリングせずにストリーミングデータから直接インスタンス化する場合、その命令は、インスタンス化マネージャが命令を受信した時に、各命令に応答するために必要な情報をすべて有する形で書かれなければならない。あるいは、インスタンス化マネージャは、すべての命令が受信されるまでストリーミングデータをバッファリングできる。例えば、マークアップ言語を用いてインスタンス化命令が表される場合、すべてのマークアップ文書はバッファリングされる。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
本発明は、ブックマークを用いたストリーミングオブジェクトのインスタンス化を提供することにある。
【課題を解決するための手段】
【０００４】
本明細書で説明する実施形態は、ストリーミングトークンのセット内のトークンをブックマークすることに関し、各トークンはインスタンス化命令を表す。ナビゲータは、ストリーミングトークンのセットを受信して、そのトークンをインスタンス化マネージャに渡す。しかしながら、インスタンス化マネージャが、ナビゲータに特定のトークンをブックマークするように求めた場合、ナビゲータは、少なくともブックマークされるトークンから開始される（および先行するブックマークがあった場合、さらに前のトークンから開始される可能性がある）ストリーミング命令のセットをバッファリングする。ナビゲータは、インスタンス化マネージャからの命令に応じて、ブックマークから開始されるストリーミングトークンのセットを再生（replay）する。
【０００５】
インスタンス化マネージャは、ストリーミングトークンのセットを受信する。インスタンス化マネージャが特定のトークンの命令を現在処理できない場合、インスタンス化マネージャは、ナビゲータにその特定のトークンをブックマークするように命令する。インスタンス化マネージャが、その後、インスタンス化マネージャがブックマークに戻ることを可能にするトークンを受信した時、インスタンス化マネージャは、ブックマークに戻ってそのブックマークから開始されるインスタンス化命令を再生する。
【０００６】
これによって、インスタンス化マネージャが、すべてのインスタンス化命令をバッファリングする必要なく、一群のインスタンス化命令に適切に従うことが可能になる。さらに、インスタンス化マネージャは、トークンを受信した時にすべてのトークンを処理することができなくてもインスタンス化トークンのストリームを処理できる。
【０００７】
上述した本発明の概要は、特許請求の範囲に記載の事項の重要な特徴または不可欠な特徴を特定することを意図せず、また、特許請求の範囲に記載の事項の範囲を決めるのに役立つものとして用いられることも意図しない。
【０００８】
本発明の上記およびその他の利点および特徴を得ることができる方法を説明するために、本発明の実施形態のより詳細な説明を添付図面で示す。これらの図面は、単に本発明の典型的な実施形態を示すものであり、本発明の範囲を限定するものとは見なされないという理解のもと、添付図面を用いることによって付加的な詳細とともに本実施形態を説明する。
【図面の簡単な説明】
【０００９】
【図１】ストリーミングデータを送信するために動作できる例示的なコンピュータシステムを示す図である。
【図２】ストリーミングデータを用いてオブジェクトをメモリ内でインスタンス化するソフトウェアアーキテクチャを示す図である。
【図３】ナビゲータが、ストリーミングトークンに応じてオブジェクトのインスタンス化を行う方法のフローチャートを示す図である。
【図４】ナビゲータにトークンをブックマークさせる方法のフローチャートを示す図である。
【図５】ナビゲータに、先行するブックマークからトークンストリームを再生する再生モードに入らせることができる方法のフローチャートを示す図である。
【図６】インスタンスマネージャが、ナビゲータからトークンのセットを受信する方法のフローチャートを示す図である。
【発明を実施するための形態】
【００１０】
本明細書で説明する実施形態に従って、ストリーミングトークンのセット内のトークンをブックマークすることを説明する。ここで、各トークンは、インスタンス化命令を表すか、または少なくともインスタンス化のコンテキストを渡す。ナビゲータは、ストリーミングトークンのセットを受信して、そのトークンをインスタンス化マネージャに渡す。しかしながら、ナビゲータが特定のトークンをブックマークするように求められた場合、ナビゲータは、少なくともブックマークされるトークンから開始される（および先行するブックマークがあった場合、さらに前のトークンから開始される可能性がある）ストリーミング命令のセットをバッファリングする。ナビゲータは、インスタンス化マネージャからの命令に応じて、ブックマークから開始されるストリーミングトークンのセットを再生する。
【００１１】
まず、一般的なコンピュータシステムについての導入的説明をある程度行った後、図１に関連して基本的なコンピュータシステムを説明する。その後、図２から６に関連して、ストリーミングデータに基づいてオブジェクトをインスタンス化するコンテキストにおいてブックマークを用いるさまざまな実施形態を説明する。
【００１２】
コンピュータシステムは、多様な形をとりながら広まっている。コンピュータシステムは、例えば、ハンドヘルドデバイス、電化製品、ラップトップコンピュータ、デスクトップコンピュータ、メインフレーム、分散コンピュータシステム、または標準のコンピュータシステムとは見なされていないデバイスであってもよい。本明細書および特許請求の範囲において、用語「コンピュータシステム」は、少なくとも１つのプロセッサと、プロセッサが実行できるコンピュータ実行可能命令を有することができるメモリとを含む任意のデバイスまたはシステム（またはそれらの組み合わせ）を含むものとして広く定義される。メモリは、任意の形をとってよく、コンピュータシステムの性質および形によって決めてよい。コンピュータシステムは、ネットワーク環境に分散してよく、複数の構成要素を含むコンピュータシステム（multiple constituent computing system）を含んでよい。
【００１３】
図１を参照すると、その最も基本的な構成において、コンピュータシステム１００は、典型的には、少なくとも１つのプロセッサ１０２とメモリ１０４とを含む。メモリ１０４は、揮発性、不揮発性、またはその２つの或る組み合わせからなる物理システムメモリであってよい。用語「メモリ」は、本明細書において物理記憶媒体などの不揮発性の大容量記憶装置を示すのに用いることもできる。コンピュータシステムが分散された場合、その処理、記憶および／または格納能力も分散できる。本明細書で用いられるように、用語「モジュール」または「コンポーネント」は、コンピュータシステム上で実行するソフトウェアオブジェクトまたはルーチンを示すことができる。本明細書で説明する様々なコンポーネント、モジュール、エンジン、およびサービスを、コンピュータシステム上で実行されるオブジェクトまたはプロセスとして（例えば、個々のスレッドとして）実装できる。
【００１４】
以下の説明において、１または複数のコンピュータシステムによって行われる動作を参照して実施形態を説明する。そのような動作がソフトウェアに実装される場合、その動作を行うことに関連するコンピュータシステムの１または複数のプロセッサは、コンピュータ実行可能命令が実行されたことに応じてコンピュータシステムの動作を導く。そのような動作の例は、データの操作を伴う。コンピュータ実行可能命令（および操作されるデータ）を、コンピュータシステム１００のメモリ１０４に格納できる。
【００１５】
コンピュータシステム１００は、コンピュータシステム１００が、例えば、ネットワーク１１０などの他のコンピュータシステムとの通信を行うことができるようにする通信チャネル１０８を含むこともできる。通信チャネル１０８は、通信媒体の例である。通信媒体は、典型的には、コンピュータ可読命令、データ構造、プログラムモジュール、または他のデータを、搬送波または他の移送機構などの変調データ信号によって具体化し、任意の情報配信媒体を含む。例を挙げると、通信媒体は、有線ネットワークおよび直接有線接続などの有線媒体と、音響、無線、赤外線などの無線媒体および他の無線媒体とを含むが、これらに限定されない。本明細書で用いられる用語コンピュータ可読媒体は、記憶媒体と通信媒体とを含む。
【００１６】
図１において、コンピュータシステム１００は、通信チャネル１０８を経由するストリーミングデータ１１２の受信を示す。ストリーミングデータ１１２は、プロセッサ１０２に、メモリ１０４内において１または複数のオブジェクトをインスタンス化させるオブジェクトのインスタンス化命令を表す。具体的には、オブジェクト１１４は、メモリ１０４の揮発性部においてインスタンス化されるように示されている。オブジェクト１１４は、ストリーミングデータ１１２に応じてインスタンス化されていてもよい。ストリーミングデータは、図１に示すネットワーク経由で受信できるが、その他のデータチャネル経由で受信することもできる。例えば、ローカルディスク、メモリスティック、光ディスクドライブなどからストリーミングデータを得ることができる。図２および後続の図を参照して、このプロセスについてさらに詳細に説明するが、これらの例には限定されない。
【００１７】
本発明の範囲における実施形態は、格納されたコンピュータ実行可能命令を実行し、またはデータ構造を有するコンピュータ可読媒体も含む。そのようなコンピュータ可読媒体は、汎用または専用のコンピュータによってアクセスすることができる入手可能な任意の媒体とすることができる。例を挙げると、そのようなコンピュータ可読媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭなどの物理記憶装置および／またはメモリ媒体、もしくは他の光ディスク記憶装置、磁気ディスク記憶装置もしくは他の磁気記憶装置、またはコンピュータ実行可能命令またはデータ構造の形式で所望のプログラムコード手段を実行しまたは格納するのに用いることができて、汎用または専用のコンピュータによってアクセスすることができるその他の媒体を備えることができるが、これに限らない。ネットワークまたは別の通信接続（有線、無線、または有線もしくは無線の組み合わせのいずれか）を経由してコンピュータに情報を転送しまたは渡す時、そのコンピュータは、その接続をコンピュータ可読媒体として適切に見なす。従って、そのような接続はどれでもコンピュータ可読媒体と適切に呼ばれる。上記の組み合わせもコンピュータ可読媒体の範囲内に含めなければならない。
【００１８】
コンピュータ実行可能命令は、例えば、汎用コンピュータ、専用コンピュータ、または専用処理デバイスに、或る機能または一群の機能を行わせる命令およびデータを備える。発明の対象事項を、構造的特徴および／または方法論的動作に特有の言語によって説明するが、添付の特許請求の範囲に定義された発明の対象事項は、本明細書で説明される具体的な特徴または動作に必ずしも限定されないことを理解されたい。むしろ、本明細書で説明される具体的な特徴および動作は、特許請求の範囲を実装する例示的な形として開示される。
【００１９】
図２は、ストリーミングデータを用いてメモリ内でオブジェクトをインスタンス化するソフトウェアアーキテクチャ２００を示す。物理層において、ストリーミングデータは、電気信号または光信号などの或る物理形式によって表される単純なデジタルビット列である。ストリーミングデータ２０１は、バイナリ１とバイナリ０とから成るバイナリ列として示される。
【００２０】
リーダ２１１は、ハードウェア、ソフトウェア、ファームウェア、またはそれらを組み合わせたもので実装できる。一実施形態では、リーダ２１１自体が、メモリ内でインスタンス化されたオブジェクトである。リーダ２１１は、受信したデータストリーム２０１をトークン２０２の列に変換するロジックを含む。それぞれのトークンはインスタンス化のコンテキストを表し、一部がインスタンス化命令を表す。
【００２１】
この変換プロセスは、いくつかのステップにおいて行われる。例えば、データストリーム２０１によって表されるインスタンス化命令のセットがマークアップ言語文書（例えば、ＸＭＬ(eXtensible Markup Language)文書）の場合、そのトークンは、特定の要素の先頭、特定の要素の終端、要素の中身、要素の属性などを表すことができる。リーダ２１１は、従って、最初に各ビット列の区分を特定の文字に変換する。例えば、ＡＳＣＩＩ文字を表すビット列に対して、各ビット列は、８ビットになり得る。しかしながら、ユニコード文字あるいは他の文字セットの場合のように、文字を他のビット列長によっても表すことができる。リーダ２１１は、次に文字ストリームを解析して、階層的なマークアップ言語文書の論理部分を表す論理セクション（すなわち、トークン）を見つけることができる。リーダ２１１は、フロー制御およびバッファリングの制限を任意に行ってトークンストリーム２０２を渡すこともできる。
【００２２】
ナビゲータ２１２も、コンポーネントとしてハードウェア、ソフトウェア、ファームウェア、またはそれらを組み合わせたもので実装できる。一実施形態では、ナビゲータ２１２自体が、メモリ内でインスタンス化されたオブジェクトとすることができる。ナビゲータ２１２は、リーダ２１１からトークン２０２を受信する。リーダ２１１は、プッシュ形式によってトークン２０２をナビゲータ２１２に渡すことができる。しかしながら、バッファリング要件を減らすまたは無くすために、以下で詳細に説明するさまざまな例において、ナビゲータ２１２は、各トークンの明示的なナビゲータ要求に応じて、プル形式によってリーダ２１１からトークンを一つずつ受信する。
【００２３】
ナビゲータ２１２は、ナビゲータにトークンストリーム２０３をブックマークさせることを可能にするブックマーキング機構（ＢＭ）２０５を含む。ナビゲータ２１２は、トークンストリーム２０３を、実質的にメモリ２１４内でオブジェクトをインスタンス化するインスタンス化マネージャ２１３に渡す。インスタンス化マネージャ２１３に渡されたトークンストリーム２０３内にあるトークンは、ナビゲータ２１２に渡されたトークンストリーム２０２内にあるトークンと同じである。しかしながら、以下で説明するように、ブックマーキング機構２０５によって、これらのトークンを、トークンストリーム２０２と比べて異なる順序でトークンストリーム２０３内に渡すことができる。インスタンス化マネージャ２１３は、ブックマークが、トークンストリーム２０２においてナビゲータ２１２によって生成されるようにすることができる。各ブックマークは、後で戻る特定のトークンを表し、ブックマークされたトークンから開始されるトークンストリームの再生をシミュレートする。ナビゲータ２１２は、バッファ２０６内にブックマークから開始されるトークンストリームをバッファリングすることによって、そのトークンストリームを再生できる。バッファされたトークンストリームは、後で、ブックマークが解放（release）された時に解放されて、そのトークンストリームはバッファから再生される。
【００２４】
インスタンス化マネージャ２１３は、トークンストリーム２０２によって表され、ナビゲータ２１２から受信するインスタンス化命令に応じて、メモリ２１４内でオブジェクトを実質的にインスタンス化する。インスタンス化マネージャ２１３が戻ってトークンストリームの先行する部分を再生できるので、用語「トークンストリーム」は、ナビゲータ２１２からインスタンス化マネージャ２１３に渡されるトークン列に関して広い意味に用いられる。インスタンス化マネージャ２１３も、ハードウェア、ソフトウェア、またはそれらを組み合わせたもので実装でき、メモリ内、恐らくはオブジェクトをインスタンス化する同じメモリ２１４内でインスタンス化されるオブジェクトとすることもできる。
【００２５】
インスタンス化マネージャ２１３は、一群のクラス定義２０４にアクセスできる。例示において、インスタンス化マネージャ２１３は、３つの特定のクラス定義２０４Ａ、２０４Ｂ、２０４Ｃにアクセスできる。しかしながら、インスタンス化マネージャ２１３は、省略記号２０４Ｄを用いて象徴的に表されているように、任意の数（１または複数）のクラス定義にアクセスし得る。インスタンス化マネージャ２１３は、メモリ２１４内で任意の数のオブジェクトをインスタンス化できる。例えば、インスタンス化マネージャは、メモリ内で３つのオブジェクト２０５Ａ、２０５Ｂ、２０５Ｃをインスタンス化しているように示されている。しかしながら、インスタンス化マネージャ２１３は、省略記号２０５Ｄによって表されているように、メモリ内で任意の数のオブジェクトをインスタンス化できる。オブジェクトインスタンスは、そのオブジェクトに対応するクラス定義に従ってメモリ内で割り当てることができる。
【００２６】
図３に、ナビゲータが、ストリーミングトークンに応じてオブジェクトのインスタンス化を行うための方法３００のフローチャートを示す。方法３００は、ナビゲータが、インスタンス化マネージャがトークンストリーム内の次のトークンに対して準備ができていると判断する度に行われる（動作３０１）。トークンストリーム内の各トークンは、インスタンス化マネージャの或るインスタンス化のコンテキストを表すことを思い起こしていただきたい。
【００２７】
ナビゲータからインスタンス化マネージャに渡されるトークンストリームは、生の（ｌｉｖｅ）トークンストリームとすることができ、この場合、ナビゲータは、トークンをリーダから受信するとそのままトークンを渡す。一方、トークンストリームは、再生モードにすることもでき、その場合、ナビゲータは、トークンを、そのバッファからインスタンス化マネージャに渡す。特定のトークンストリーム内の第１トークンに対して、トークンストリームは生（判定ブロック３０２の“Ｌｉｖｅ”）になる。
【００２８】
生のトークンストリーム（判定ブロック３０２の“Ｌｉｖｅ”）の場合、ナビゲータは、リーダからストリームの次のトークンを得る（動作３０３）。プル機構において、ナビゲータは、リーダからの次のトークンの明示的な要求を行うことができ、その要求への応答としてトークンを受信する。トークンストリーム内に先行するブックマークセットがある場合（判定ブロック３０４の“はい”）、ナビゲータは、リーダからトークンを得るとすぐにバッファリングし（動作３０５）、さらにトークンをインスタンス化マネージャに渡す（動作３０６）。バッファリングに先行してトークンをインスタンス化マネージャに渡すことも可能である。従って、動作３０５と３０６とに対して相対的なタイミング要件はない。トークンストリーム内に先行するブックマークセットがない場合（判定ブロック３０４の“いいえ”）、ナビゲータは、トークンをバッファリングせずにインスタンス化マネージャに渡す（動作３０６）。
【００２９】
一実施形態において、バッファ２０６は、個々に連結されたリスト（ｓｉｎｇｌｙ  ｌｉｎｋｅｄ  ｌｉｓｔ）として実装され、バッファ内の各トークンが、個々に連結されたリスト内のノードに関連して開始される。個々に連結されたリスト内の最後のノードを除いて、各ノードは、リスト内の次のノードへのリンクも含む。トークンストリームを使用するすべてのブックマークは、連結されたリストを共有する。生のトークンストリーム（判定ブロック３０２の“Ｌｉｖｅ”）の場合において、先行するブックマークセットがない場合（判定ブロック３０４の“いいえ”）、バッファ内にトークンはなく、連結されたリストはゼロ長（ｌｅｎｇｔｈ  ｏｆ  ｚｅｒｏ）を有する。一方、生のトークンストリーム（判定ブロック３０２の“Ｌｉｖｅ”）の場合において、先行するブックマークセットがある（判定ブロック３０４の“はい”）場合、トークンは、リスト内に付加的なノードを生成することによって個々に連結されたリストに付加されて、リスト内の以前の最後のノードを、新しく生成された付加的なノードに連結する。
【００３０】
一方、再生トークンストリーム（判定ブロック３０２の“Ｒｅｐｌａｙ”）の場合、ナビゲータは、リーダから次のトークンを得るのではなく、バッファから次のトークンを渡す（動作３０７）。トークンストリーム内に先行するブックマークがある場合（判定ブロック３０８の“はい”）、ナビゲータは、バッファからのトークンをインスタンス化マネージャに渡す（動作３０６）。トークンストリーム内に先行するブックマークがない場合（判定ブロック３０８の“いいえ”）、ナビゲータは、トークンをインスタンス化マネージャに渡す（動作３０６）前、同時および／または後に、そのトークンのバッファに関連するメモリを自由に空にすることができる（しかし、必ずしも必要ではない）（動作３０９）。連結リストの実施形態において、ナビゲータは、バッファからのトークンを再生すると、連結リスト内の次のトークンに対する再生を生じさせたブックマークを進める（ａｄｖａｎｃｅ）。そのブックマークが、連結リスト内で一番初めのブックマークである場合、そのブックマークは、二度とアクセスされない過去のトークンを進める。ガーベジコレクションモジュールは、連結リスト内のそのような未使用のモジュールを周期的に検出でき、それらのトークンを連結リストから除去できる。
【００３１】
図４に、ナビゲータにトークンをブックマークさせる方法４００のフローチャートを示す。具体的には、特定のトークンをブックマークする要求をインスタンス化マネージャから受信した（動作４０１）後にブックマークが開始される。ナビゲータは、次に、トークンをブックマークして（動作４０２）、さらにそのトークンのバッファリングを開始する（動作４０３）。もちろん、このブックマーキングは、ブックマークが実施される間に受信された後続のトークンについての、図３の方法３００のフローに作用する。
【００３２】
図５に、ナビゲータを、先行するブックマークからのトークンストリームを再生する再生モードに入らせることができる方法５００のフローチャートを示す。具体的には、ナビゲータは、ブックマークされた特定のトークンから開始されるストリーミングトークンを再生する要求をインスタンス化マネージャから受信する（動作５０１）。ナビゲータは、その後、インスタンス化マネージャに渡されるべき次のトークンとして、ブックマークされたトークンに戻ることによって再生モードに入る（動作５０２）。
【００３３】
図６に、ナビゲータからトークンのセットを受信するインスタンス化マネージャに関する方法６００のフローチャートを示す。インスタンス化マネージャがナビゲータからトークンを受信する（動作６０１）度に、方法６００が開始される。最初に、インスタンス化マネージャは、受信した命令によって表された任意のインスタンス化命令を現在実行できるか否かを判断する（判定ブロック６０２）。
【００３４】
インスタンス化マネージャが現在インスタンス化命令を実行できる場合（判定ブロック６０２の“はい”）、インスタンス化マネージャは、そのインスタンス化命令を実行する（動作６０３）。さらに、先行するブックマークされたトークンがあり、インスタンス化命令が、インスタンス化マネージャに先行するブックマークされたインスタンス化トークンを実行させることができる場合（判定ブロック６０５の“はい”）、インスタンス化マネージャは、その先行するブックマークされたトークンから開始されるトークンを再生する（動作６０６）。例えば、インスタンス化マネージャは、再生命令をナビゲータに渡すことができ、ナビゲータに図５の方法５００を実行させることができる。そうでない場合（判定ブロック６０５の“いいえ”）、インスタンス化マネージャは、ナビゲータに、次のトークンに対して準備ができていることを任意に通知しながら次のトークンを単に待つ（動作６０７）。
【００３５】
インスタンス化マネージャが現在インスタンス化命令を実行できない場合（判定ブロック６０２の“いいえ”）、インスタンス化マネージャは、現在のトークンをブックマークする（動作６０８）。例えば、インスタンス化マネージャは、ナビゲータがトークンをブックマークすることを要求することができ、ナビゲータに図４の方法４００を実行させることができる。インスタンス化マネージャは、その後、次のトークンを待つ（動作６０７）。
【００３６】
このように、本明細書で説明する実施形態は、インスタンス化マネージャが特定のトークンにすぐに応答できない場合に、トークンストリームが再生（ｒｅｐｌａｙ）されることを可能にする。インスタンス化マネージャは、そのトークンをブックマークし、そのブックマークされたトークンによって渡されたインスタンス化のコンテキストを受信する準備ができた時に、そのトークンから開始されるストリームの再生に戻ることできる。
【００３７】
特に具体的な２つの例を説明する。具体的な各例において、クラス定義はＣ＃で行う。また、特定のトークンストリームと、関連する階層的なマークアップ言語文書とを示し、具体的な実施形態に従ってどのようにトークンが処理されるかを説明する。これらの例は、単に例示目的として示す。第１例は、１つのレベルのブックマーキングのみを説明する単純なものである。この第１例を、「単一ブックマーク（ｓｉｎｇｌｅ  ｂｏｏｋｍａｒｋ）」例と呼ぶ。第２例はより複雑であり、ブックマーキングのいくつかの階層を示す。本明細書では、「複数ブックマーク（multiple bookmark）」例と呼ぶ。
【００３８】
単一ブックマーク例では、その目的は、以下の定義に従ったクラスのオブジェクトインスタンスを生成することである。  
public class Monster<TWeapon>
{
public int SizeInMeters{get;set;}
public string Name{get;set;}
}
【００３９】
Ｍｏｎｓｔｅｒオブジェクトの構造は、ＴＷｅａｐｏｎ型引数に依存するので、Ｍｏｎｓｔｅｒクラスは、Ｍｏｎｓｔｅｒクラスを均等に割り当てるために型引数ＴＷｅａｐｏｎを要求する標準クラスである。以下は、一群のインスタンス化命令の非直列化形式（deserialized form）の例である。  
<Monster>
<Monster.SizeInMeters>100</Monster.SizeInMeters>
<x:TypeArguments>Fire</x:TypeArguments>
<Monster.Name>Godzilla</Monster.Name>
</Monster>
【００４０】
リーダによってビットストリームから抽出された対応するトークン列を以下のように表す。  
1 StartElement: Monster
2 StartElement: Monster.SizeInMeters
3 Text: 100
4 EndElement: Monster.SizeInMeters
5 StartElement: x:TypeArguments
6 Text: Fire
7 EndElement: x:TypwArguments
8 StartElement: Monster.Name
9 Text: Godzilla
10 EndElement: Monster.Name
11 EndElement: Monster
【００４１】
トークン１は、ナビゲータからインスタンス化マネージャに渡される。しかしながら、インスタンス化マネージャは、型引数ＴＷｅａｐｏｎを認識していないので、まだＭｏｎｓｔｅｒオブジェクトを生成することができない。本例においてＭｏｎｓｔｅｒクラスは標準クラスなので、オブジェクトの構造を認識していても型引数が必要であることを思い起こしていただきたい。オブジェクトの構造をまだ認識していないので、インスタンス化マネージャは、ナビゲータにトークン１をブックマークさせ、その後すぐにナビゲータがトークン１をバッファリングする。その後、ナビゲータは、トークン２，３および４をインスタンス化マネージャに渡して、同様にナビゲータはこれらのトークンもバッファリングする。インスタンス化マネージャは、モンスターオブジェクトがまだ生成されてなくて、これらのトークンに従うにはモンスターオブジェクトの存在が必要であるので、トークン２−４にまだ対処することができない。
【００４２】
ナビゲータは、次に、インスタンス化マネージャにトークン５“ＳｔａｒｔＥｌｅｍｅｎｔ：  ｘ：ＴｙｐｅＡｒｇｕｍｅｎｔｓ”を渡して、モンスターオブジェクトを生成するのに必要な型引数を受信しようとしていることをインスタンス化マネージャに合図する。
【００４３】
ナビゲータは、次に、トークン６“Ｔｅｘｔ：  Ｆｉｒｅ”をインスタンス化マネージャに渡して、モンスタークラスの型引数が“Ｆｉｒｅ”であることを知らせる。この時点で、あるいはインスタンス化マネージャがトークン７“ＥｎｄＥｌｅｍｅｎｔ：  ｘ：ＴｙｐｅＡｒｇｕｍｅｎｔｓ”を受信した後で、インスタンス化マネージャは、型引数が“Ｆｉｒｅ”であることを認識する。インスタンス化マネージャは、ナビゲータに、先行するブックマークであるトークン１から再生するように命令する。
【００４４】
インスタンス化マネージャが再度トークン１を受信すると、モンスターオブジェクトが生成される。しかしながら、インスタンス化マネージャは、型引数は“Ｆｉｒｅ”になることを認識している。従って、インスタンス化マネージャは、Ｍｏｎｓｔｅｒ＜Ｆｉｒｅ＞オブジェクトを生成する。この段階で、バッファを用いるブックマークは１つだけであり、そのブックマークがバッファ内のトークン２に進んでいるので、トークン１をバッファから解放できる。
【００４５】
その後、トークン２“ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｉｚｅＩｎＭｅｔｅｒｓ”がナビゲータのバッファから再生されると、インスタンス化マネージャは、Ｍｏｎｓｔｅｒ＜Ｆｉｒｅ＞オブジェクトのＳｉｚｅＩｎＭｅｔｅｒｓプロパティに書き込む準備をする。この段階で、トークン２はバッファから解放されるが、必ずしも必要ではない。例えば、ブックマークを、個々に連結されたバッファのリスト表示内のトークン３に進めることができる。その後で、ガーベジコレクションモジュールは、連結リスト内のトークン１および２を表すノードがもはや使われていないことを検出する。
【００４６】
トークン３“Ｔｅｘｔ：  １００”が再生されると、インスタンス化マネージャは、値“１００”をＭｏｎｓｔｅｒ＜Ｆｉｒｅ＞オブジェクトのＳｉｚｅＩｎＭｅｔｅｒｓプロパティに書き込む。トークン３は、次に、バッファから廃棄される。
【００４７】
その後、トークン４“ＥｎｄＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｉｚｅＩｎＭｅｔｅｒｓ”がナビゲータのバッファから再生されると、インスタンス化マネージャは、ＳｉｚｅＩｎＭｅｔｅｒｓプロパティへの書き込みが完了したことを認識する。トークン４は、次に、バッファから廃棄される。
【００４８】
ナビゲータのバッファからトークン５から７までが再生されると、インスタンス化マネージャは、型引数がすでに設定されているので何も動作を起こす必要はないが、実際は、Ｍｏｎｓｔｅｒ＜Ｆｉｒｅ＞オブジェクトが生成される前に動作が要だった。トークン５から７までがバッファから廃棄される。
【００４９】
トークン８“ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．Ｎａｍｅ”がインスタンス化マネージャによって受信されると、ナビゲータが今はそのバッファからではなく（今空である）、ビットストリームにアクセスするリーダからトークンを渡しているので、我々は、再生モード（ｒｅｐｌａｙ  ｍｏｄｅ）を終了させて生のモード（ｌｉｖｅ  ｍｏｄｅ）に入る。インスタンス化マネージャは、Ｍｏｎｓｔｅｒ＜Ｆｉｒｅ＞オブジェクトのＮａｍｅプロパティに書き込む準備をする。
【００５０】
トークン９“Ｔｅｘｔ：Ｇｏｄｚｉｌｌａ”が、インスタンス化マネージャによって受信されると、値“Ｇｏｄｚｉｌｌａ”は、Ｍｏｎｓｔｅｒ＜Ｆｉｒｅ＞オブジェクトのＮａｍｅプロパティに書き込まれる。
【００５１】
トークン１０“ＥｎｄＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．Ｎａｍｅ”によって、インスタンス化マネージャは、Ｎａｍｅプロパティへの書き込みが完了したことを認識する。
【００５２】
トークン１１“ＥｎｄＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ”によって、インスタンス化マネージャは、Ｍｏｎｓｔｅｒ＜Ｆｉｒｅ＞オブジェクトの生成およびポピュレーティング（ｐｏｐｕｌａｔｉｎｇ）が完了したことを認識する。
【００５３】
このように、単一ブックマークの例では、インスタンス化マネージャは、トークンをブックマークすることが可能であったので、そのブックマークされたトークンに応じる適切なコンテキストがあった場合、インスタンス化マネージャを後でそのトークンに戻らせることができる。一部のバッファリングが行われたが、すべてのインスタンス化命令のセットはバッファリングされなかった。
【００５４】
次の例は、複数ブックマークの例である。この具体例において、３つの相対的なクラス定義があり、１つはＣｉｔｙ、１つはＣｏｕｎｔｒｙ、そして新しい１つはＭｏｎｓｔｅｒであり、以下のとおりＣ＃で書き込まれる。  
public class City
{
public City(Country country);
public string Name{get;set;}
public string Population{get;set;}
}
public class Country
{
public string Name{get;set;}
}
public class Monster
{
public Monster(City home);
public int SizeInMeters{get;set;}
public Color SkinColor{get;set;}
}
【００５５】
ここに、我々が非直列化したいマークアップ言語がある。本例において、ｘ：ＣｏｎｓｔｒｕｃｔｏｒＡｒｇｕｍｅｎｔｓは、オブジェクトを生成するコンストラクタに渡されるオブジェクトの直列化（serialization）を含むことに留意されたい。
<Monster>
<Monster.SizeInMeters>100</Monster.SizeInMeters>
<x;ConstructorArguments>
<City>
<City.Name>Tokyo</City.Name>
<City.Population>12800000</City.Population>
<x:ConstructorArguments>
<Country>
<Country.Name>Japan</Country.Name>
</Country>
</x:ConstructorArguments>
</City>
</x:ConstructorArguments>
<Monster.SkinColor>Green</Monster.SkinColor>
</Monster>
【００５６】
以下は、トークン列の表示である。
1 StartElement: Monster
2 StartElement: Monster.SizeInMeters
3 Text: 100
4 EndElement: Monster.SizeInMeters
5 StartElement: x:ConstructorArguments
6 StartElement: City
7 StartElement: City.Name
8 Text: Tokyo
9 EndElement: City.Name
10 StartElement: City.Population
11 Text: 12800000
12 EndElement: City.Population
13 StartElement: x:ConstructorArguments
14 StartElement: Country
15 StartElement: Country.Name
16 Text: Japan
17 EndElement: Country.Name
18 EndElement: Country
19 EndElement: x:ConstructorArguments
20 EndElement: City
21 EndElement: x:ConstructorArguments
22 StartElement: Monster.SkinColor
23 Text: Green
24 EndElemnet: Monster.SkinColor
25 EndElement: Monster
【００５７】
ナビゲータは最初に、トークンストリームの第１トークン１に対して準備ができているかを判断する。ナビゲータを動作させるインスタンス化マネージャの実施形態において、ナビゲータは、インスタンス化マネージャから可能標識（ｒｅａｄｙ  ｉｎｄｉｃａｔｏｒ）を受信できる。別の実施形態では、恐らくナビゲータが、インスタンス化マネージャから単に“Ｎｏｔ  Ｒｅａｄｙ”標識を受信しないことによって、インスタンス化マネージャがトークンストリームの第１トークン１に対して準備ができているとナビゲータに思い込ませることができる。あるいは、ナビゲータは、インスタンス化マネージャとの通信を全く行わなくても、インスタンス化マネージャは常に準備ができていると単に思い込ませる場合もある。
【００５８】
ナビゲータは、インスタンス化マネージャが準備できていると判断すると、リーダにトークン列から第１トークンを得てくるように命令する。リーダは、トークン１ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒをナビゲータに渡す。ナビゲータが今、トークンストリームを生でインスタンス化マネージャに渡しているので、ナビゲータは、トークン１ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒをインスタンス化マネージャに渡す。
【００５９】
インスタンス化マネージャは、Ｃｉｔｙコンストラクタ引数を要求するＭｏｎｓｔｅｒクラスを参照する。しかしながら、インスタンス化マネージャは、そのＣｉｔｙコンストラクタ引数をまだ有していない。従って、インスタンス化マネージャは、トークン１によって表されたインスタンス化命令をまだ実行することができない。インスタンス化マネージャは、ナビゲータにトークン１をブックマークするように命令する。本例では複数のブックマークが使用されるので、これを「第１」ブックマークと呼ぶ。ナビゲータは、第１ブックマークをトークン１ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒにおいて保持し、トークン１をバッファリングする。ナビゲータは、そのブックマークが解放されるまで後続のトークンをバッファリングし続ける。インスタンス化マネージャは、インスタンス化マネージャにブックマークに戻ることができるようにするイベント、すなわちＭｏｎｓｔｅｒクラス（すなわち、Ｃｉｔｙオブジェクト）のすべてのコンストラクタ引数が生成されたというイベントに気付くこともできる。
【００６０】
ナビゲータは、次に、リーダにビットストリームから次のトークンを得てくるように命令する。リーダは、トークン２ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｉｚｅＩｎＭｅｔｅｒｓをナビゲータに渡す。ナビゲータは、トークン１とともにこのトークンをバッファリングして、トークン２ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｉｚｅＩｎＭｅｔｅｒｓをインスタンス化マネージャに渡す。インスタンス化マネージャは、コンストラクタ引数がまだ必要であるので、トークン１をまだ処理することができない。
【００６１】
ナビゲータは、リーダにビットストリームから次のトークンを得てくるように命令する。リーダは、トークン３Ｔｅｘｔ：  １００をナビゲータに渡す。ナビゲータは、トークン１−３をバッファリングして、トークン３Ｔｅｘｔ：  １００をインスタンス化マネージャに渡す。この時点ではＭｏｎｓｔｅｒオブジェクトすら生成されていないので、インスタンス化マネージャは、まだ動作を起こすことができない。このプロセスは、トークン４ＥｎｄＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｉｚｅＩｎＭｅｔｅｒｓでも繰り返す。
【００６２】
ナビゲータは、リーダにビットストリームから次のトークンを得てくるように命令する。リーダは、トークン５ＳｔａｒｔＥｌｅｍｅｎｔ：  ｘ：ＣｏｎｓｔｒｕｃｔｏｒＡｒｇｕｍｅｎｔｓをナビゲータに渡す。ナビゲータは、トークン１−５をバッファリングして、トークン５ＳｔａｒｔＥｌｅｍｅｎｔ：  ｘ：ＣｏｎｓｔｒｕｃｔｏｒＡｒｇｕｍｅｎｔｓをインスタンス化マネージャに渡す。この時点ではＭｏｎｓｔｅｒオブジェクトすら生成されていないので、インスタンス化マネージャは、まだ動作を起こすことができない。インスタンス化マネージャは、コンストラクタオブジェクトを生成する準備を任意にする。
【００６３】
ナビゲータは、リーダにビットストリームから次のトークンを得てくるように命令する。リーダは、トークン６ＳｔａｒｔＥｌｅｍｅｎｔ  Ｃｉｔｙをナビゲータに渡す。ナビゲータは、トークン１−６をバッファリングして、トークン６ＳｔａｒｔＥｌｅｍｅｎｔ  Ｃｉｔｙをインスタンス化マネージャに渡す。この時点ではＭｏｎｓｔｅｒオブジェクトすら生成されていないので、インスタンス化マネージャは、トークン１の第１ブックマークに対してまだ動作を起こすことができない。さらにトークン６は、インスタンス化マネージャにＣｉｔｙオブジェクトをインスタンス化するように命令する。インスタンス化マネージャは、Ｃｉｔｙクラスを参照するが、Ｃｏｕｎｔｒｙコンストラクタが必要であるのでＣｉｔｙオブジェクトをまだインスタンス化することができない。従って、インスタンス化マネージャは、ナビゲータに、トークン６ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｉｔｙのさらに別のブックマーク（「第２」ブックマーク）を生成するように命令する。従って、今トークンストリーム内に、トークン１ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒの第１ブックマークと、トークン６ＳｔａｒｔＥｌｅｍｅｎｔ  Ｃｉｔｙの第２ブックマークとの２つのブックマークがある。ナビゲータは、次に、第２ブックマークを生成する。インスタンス化マネージャは、インスタンス化マネージャに第２ブックマークに戻ることができるようにするイベント、すなわちＣｏｕｎｔｒｙオブジェクトが生成されてポピュレートされるイベントにも気付くことができる。
【００６４】
ナビゲータは、リーダにビットストリームから次のトークンを得てくるように命令する。リーダは、トークン７ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｉｔｙ．Ｎａｍｅをナビゲータに渡す。ナビゲータは、トークン１−７をバッファリングして、トークン７ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｉｔｙ．Ｎａｍｅをインスタンス化マネージャに渡す。この時点ではＭｏｎｓｔｅｒオブジェクトすら生成されていないので、インスタンス化マネージャは、トークン１ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒの第１ブックマークに対してまだ動作を起こすことができない。さらに、Ｃｏｕｎｔｒｙコンストラクタ引数が必要であるのでＣｉｔｙオブジェクトがまだ生成されていないことから、インスタンス化マネージャは、トークン６ＳｔａｒｔＥｌｅｍｅｎｔ  Ｃｉｔｙの第２ブックマークに対して動作を起こすことができない。このプロセスは、トークン８Ｔｅｘｔ  Ｔｏｋｙｏ、トークン９ＥｎｄＥｌｅｍｅｎｔ  Ｃｉｔｙ．Ｎａｍｅ、トークン１０ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｉｔｙ．Ｐｏｐｕｌａｔｉｏｎ、トークン１１Ｔｅｘｔ：  １２８０００００、およびトークン１２ＥｎｄＥｌｅｍｅｎｔ  Ｃｉｔｙ．Ｐｏｐｕｌａｔｉｏｎでも繰り返す。各トークンは、ナビゲータから生のトークンストリームとしてインスタンス化マネージャに渡されて、各々がナビゲータによってバッファリングされるが、ＭｏｎｓｔｅｒオブジェクトとＣｉｔｙオブジェクトとがまだ生成されていないので、インスタンス化マネージャは、トークンに対して何もすることができない。
【００６５】
ナビゲータがトークン１３ＳｔａｒｔＥｌｅｍｅｎｔ：  ｘＣｏｎｓｔｒｕｃｔｏｒ  Ａｒｇｕｍｅｎｔｓをインスタンス化マネージャに渡すと、インスタンス化マネージャは、Ｃｉｔｙクラスのコンストラクタ引数が渡されようとしていることを合図される。この段階では、ナビゲータは、トークン１−１３をバッファリングする。
【００６６】
ナビゲータは、リーダにビットストリームから次のトークンを得てくるように命令する。リーダは、トークン１４ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｏｕｎｔｒｙをナビゲータに渡す。ナビゲータは、トークン１−１４をバッファリングして、トークン１４ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｏｕｎｔｒｙをインスタンス化マネージャに渡す。インスタンス化マネージャは、このトークンによってＣｏｕｎｔｒｙオブジェクトをインスタンス化するように命令される。Ｃｏｕｎｔｒｙクラスが参照される。Ｃｏｕｎｔｒｙオブジェクトを割り当てることができる前に必要なコンストラクタ、型引数、または他の情報はない。従って、インスタンス化マネージャは、Ｃｏｕｎｔｒｙオブジェクトを、Ｃｏｕｎｔｒｙクラスによって定義されたようにメモリ内に割り当てる。
【００６７】
ナビゲータは、リーダにビットストリームから次のトークンを得てくるように命令する。リーダは、トークン１５ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｏｕｎｔｒｙ．Ｎａｍｅをナビゲータに渡す。ナビゲータは、トークン１−１５をバッファリングして、トークン１５ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｏｕｎｔｒｙ．Ｎａｍｅをインスタンス化マネージャに渡す。インスタンス化マネージャは、新しくインスタンス化されたＣｏｕｎｔｒｙオブジェクトのＮａｍｅプロパティに値を書き込む準備をする。
【００６８】
ナビゲータは、リーダにビットストリームから次のトークンを得てくるように命令する。リーダは、トークン１６Ｔｅｘｔ：  Ｊａｐａｎをナビゲータに渡す。ナビゲータは、トークン１−１６をバッファリングして、トークン１６Ｔｅｘｔ：  Ｊａｐａｎをインスタンス化マネージャに渡す。インスタンス化マネージャは、値“Ｊａｐａｎ”をＣｏｕｎｔｒｙオブジェクトのＮａｍｅプロパティに書き込む。
【００６９】
リーダは、トークン１７ＥｎｄＥｌｅｍｅｎｔ：  Ｃｏｕｎｔｒｙ．Ｎａｍｅをナビゲータに渡す。ナビゲータは、トークン１−１７をバッファリングして、トークン１７をインスタンス化マネージャに渡す。インスタンス化マネージャは、ＣｏｕｎｔｒｙオブジェクトのＮａｍｅプロパティへの書き込みが今完了したことを通知する。
【００７０】
リーダは、トークン１８ＥｎｄＥｌｅｍｅｎｔ：  Ｃｏｕｎｔｒｙをナビゲータに渡す。ナビゲータは、トークン１−１８をバッファリングして、トークン１８をインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｃｏｕｎｔｒｙオブジェクトのインスタンス化およびポピュレーションが今完了したことに気付く。インスタンス化マネージャは、今Ｃｉｔｙオブジェクトのコンストラクタとして用いるＣｏｕｎｔｒｙオブジェクトを有し、今からＣｉｔｙオブジェクトを生成し得る。これは、インスタンス化マネージャに第２ブックマークに戻ることができるようにするイベントである。インスタンス化マネージャは、ナビゲータに、トークン６の第２ブックマークである最後のブックマークから開始されるトークンストリームを再生するように命令する。第２ブックマークは、次に、除去されて、トークン１ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒの第１ブックマークのみを残す。
【００７１】
リーダからの情報を要求せずに、ナビゲータは、そのバッファからトークン６ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｉｔｙをインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｃｉｔｙクラスのすべてのコンストラクタ引数を有していることに気付くので、Ｃｉｔｙオブジェクトをインスタンス化する。インスタンス化マネージャは、たとえＣｉｔｙオブジェクトがインスタンス化されていても、Ｍｏｎｓｔｅｒオブジェクトのコンストラクタ引数として用いるのには準備がまだ十分でないので、トークン１をまだ処理することができない。
【００７２】
ナビゲータは、次に、そのバッファからトークン７ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｉｔｙ．Ｎａｍｅをインスタンス化マネージャに渡す。インスタンス化マネージャは、ＣｉｔｙオブジェクトのＮａｍｅフィールドに書き込む準備をする。
【００７３】
ナビゲータは、次に、そのバッファからトークン８Ｔｅｘｔ：  Ｔｏｋｙｏをインスタンス化マネージャに渡す。インスタンス化マネージャは、ＣｉｔｙオブジェクトのＮａｍｅフィールドの値として“Ｔｏｋｙｏ”を書き込む。
【００７４】
ナビゲータは、次に、そのバッファからトークン９ＥｎｄＥｌｅｍｅｎｔ：  Ｃｉｔｙ．Ｎａｍｅをインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｎａｍｅプロパティの値の書き込み動作が完了したことに気付く。
【００７５】
ナビゲータは、次に、そのバッファからトークン１０ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｉｔｙ．Ｐｏｐｕｌａｔｉｏｎをインスタンス化マネージャに渡す。インスタンス化マネージャは、ＣｉｔｙオブジェクトのＰｏｐｕｌａｔｉｏｎフィールドに値を書き込む準備をする。
【００７６】
ナビゲータは、次に、そのバッファからトークン１１Ｔｅｘｔ：  １２８０００００をインスタンス化マネージャに渡す。インスタンス化マネージャは、ＣｉｔｙオブジェクトのＰｏｐｕｌａｔｉｏｎプロパティに値“１２８０００００”を書き込む。
【００７７】
ナビゲータは、次に、そのバッファからトークン１２ＥｎｄＥｌｅｍｅｎｔ：  Ｃｉｔｙ．Ｐｏｐｕｌａｔｉｏｎをインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｐｏｐｕｌａｔｉｏｎプロパティの書き込み動作が完了したことに気付く。
【００７８】
ナビゲータは、次に、そのバッファからトークン１３ＳｔａｒｔＥｌｅｍｅｎｔ：  ｘ：ＣｏｎｓｔｒｕｃｔｏｒＡｒｇｕｍｅｎｔｓをインスタンス化マネージャに渡す。インスタンス化マネージャは、コンストラクタ引数（複数可）を用いてＣｉｔｙオブジェクトをポピュレートする準備をする。
【００７９】
ナビゲータは、次に、そのバッファからトークン１４ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｃｏｕｎｔｒｙをインスタンス化マネージャに渡す。インスタンス化マネージャは、すでにＣｏｕｎｔｒｙオブジェクトを生成させているので、そのＣｏｕｎｔｒｙオブジェクトを用いてＣｉｔｙオブジェクトをポピュレートする。
【００８０】
ナビゲータは、そのバッファからトークン列１４−１８をインスタンス化マネージャに渡す。しかしながら、インスタンス化マネージャは、Ｃｏｕｎｔｒｙオブジェクトがすでに生成されていたので、これらのトークンに要求された動作をすでに行っている。従って、トークン１４−１８に要求される特定の動作はない。一実施形態において、特定のトークンに対して動作が行われると、そのトークンは完了したことをフラグで合図して、そのトークンストリームがインスタンス化マネージャに対して再生された時、ナビゲータがそのトークンを渡さないようにできる。この場合では、例えば、トークン１４−１８は、フラグで合図することが可能である。あるいは、インスタンス化マネージャは、フラグを見ても何も動作を起こさない場合もある。
【００８１】
ナビゲータは、次のトークン（トークン１９）をインスタンス化マネージャに送信する準備をする。しかしながら、この段階では、ナビゲータは、トークン１−１８までしかバッファリングしていない。従って、ナビゲータは、再生モードを終了して、再度生のモードに入る。従って、ナビゲータは、リーダからの次のトークンを要求する。リーダは、トークン１９ＥｎｄＥｌｅｍｅｎｔ：  ＣｏｎｓｔｒｕｃｔｏｒＡｒｇｕｍｅｎｔｓをナビゲータに渡す。ナビゲータは、（先行するブックマークがまだあるので）トークン１−１９をバッファリングして、トークン１９をインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｃｉｔｙオブジェクトのコンストラクタ引数が完了したことに気付く。
【００８２】
リーダは、トークン２０ＥｎｄＥｌｅｍｅｎｔ：  Ｃｉｔｙをナビゲータに渡す。ナビゲータは、トークン１−２０をバッファリングして、トークン２０をインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｃｉｔｙオブジェクトが今完了したことに気付く。Ｃｉｔｙオブジェクトが完了したので、インスタンス化マネージャは、Ｃｉｔｙオブジェクトをコンストラクタ引数として要求したトークン１に対処する準備が今できている。インスタンス化マネージャは、第１ブックマークに戻る対応もできていることに気付くことができる。インスタンス化マネージャは、ナビゲータに最後のブックマークから再生するように命令する。トークン６の第２ブックマークがすでに削除されているので、最後のブックマークは、トークン１ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒの第１ブックマークである。
【００８３】
ナビゲータは、トークン１から再生して、第１トークンを削除する。ナビゲータは、そのバッファからトークン１ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒをインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｍｏｎｓｔｅｒクラスを参照し、今Ｍｏｎｓｔｅｒクラスのすべてのコンストラクタ引数（すなわち、Ｃｉｔｙオブジェクト）を含むことに気付き、よって、Ｍｏｎｓｔｅｒオブジェクトを割り当てる。任意には、トークンストリーム内にこれ以上ブックマークがないので、ナビゲータは、トークンをインスタンス化マネージャに渡すと、各トークンをそのバッファから解放できる。あるいは、ナビゲータは、バッファの再生が完了した時点ですべてのバッファを解放することもでき、ナビゲータは、トークンストリーム内にブックマークが残ってない生のモードに再度入る。
【００８４】
ナビゲータは、そのバッファからトークン２ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｉｚｅＩｎＭｅｔｅｒｓをインスタンス化マネージャに渡す。インスタンス化マネージャは、ＭｏｎｓｔｅｒオブジェクトのＳｉｚｅＩｎＭｅｔｅｒｓプロパティに値を書き込む準備をする。任意には、次いで、トークン２はバッファから解放されるが、上述したように、バッファを後で開放することもできる。
【００８５】
ナビゲータは、そのバッファからトークン３Ｔｅｘｔ：  １００をインスタンス化マネージャに渡す。インスタンス化マネージャは、ＭｏｎｓｔｅｒオブジェクトのＳｉｚｅＩｎＭｅｔｅｒｓプロパティに値“１００”を書き込む。
【００８６】
ナビゲータは、そのバッファからトークン４ＥｎｄＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｉｚｅＩｎＭｅｔｅｒｓをインスタンス化マネージャに渡す。インスタンス化マネージャは、ＭｏｎｓｔｅｒオブジェクトのＳｉｚｅＩｎＭｅｔｅｒｓプロパティへの書き込みが完了したことに気付く。
【００８７】
ナビゲータは、そのバッファからトークン５ＳｔａｒｔＥｌｅｍｅｎｔ：  ｘ：ＣｏｎｓｔｒｕｃｔｏｒＡｒｇｕｍｅｎｔｓをインスタンス化マネージャに渡す。インスタンス化マネージャは、コンストラクタ引数（複数可）を用いてＭｏｎｓｔｅｒオブジェクトをポピュレートする準備をする。
【００８８】
ナビゲータは、そのバッファからトークン６ＳｔａｒｔＥｌｅｍｅｎｔ  Ｃｉｔｙをインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｃｉｔｙオブジェクトを用いてＭｏｎｓｔｅｒオブジェクトをポピュレートする。
【００８９】
ナビゲータは、今度はそのバッファからトークン７−２０を一つずつインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｃｉｔｙオブジェクトがすでに構成されているので、実質的にトークン７−２０に応じる動作をまったく起こさない。ナビゲータは、そのバッファ内のすべてのトークン（すなわち、トークン１−２０）を再生したので、これ以上トークンをバッファリングせずに、リーダから新しいトークンを得る生のモードに入る。
【００９０】
ナビゲータは、リーダがビットストリーム内の次のトークンを渡すことを要求する。リーダは、トークン２１ＥｎｄＥｌｅｍｅｎｔ：  ｘ：ＣｏｎｓｔｒｕｃｔｏｒＡｒｇｕｍｅｎｔｓをナビゲータに渡す。ナビゲータは、トークンストリーム内に現在ブックマークがない生のモードである。従って、トークン２１をバッファリングする必要はない。その代わりに、ナビゲータは、トークン２１をバッファリングせずにインスタンス化マネージャに渡す。インスタンス化マネージャは、Ｍｏｎｓｔｅｒオブジェクトのコンストラクタ引数が完了したことに気付く。
【００９１】
リーダは、トークン２２ＳｔａｒｔＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｋｉｎＣｏｌｏｒをナビゲータに渡し、ナビゲータは、バッファリングせずにインスタンス化マネージャに転送する。インスタンス化マネージャは、ＭｏｎｓｔｅｒオブジェクトのＳｋｉｎＣｏｌｏｒプロパティに値を書き込む準備をする。
【００９２】
リーダは、トークン２３Ｔｅｘｔ：  Ｇｒｅｅｎをナビゲータに渡し、ナビゲータは、バッファリングせずにインスタンス化マネージャに転送する。インスタンス化マネージャは、ＭｏｎｓｔｅｒオブジェクトのＳｋｉｎＣｏｌｏｒプロパティに値“Ｇｒｅｅｎ”を書き込む。
【００９３】
リーダは、トークン２４ＥｎｄＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒ．ＳｋｉｎＣｏｌｏｒをナビゲータに渡し、ナビゲータは、バッファリングせずにインスタンス化マネージャに転送する。インスタンス化マネージャは、ＳｋｉｎＣｏｌｏｒプロパティへの値書き込む動作が完了したことに気付く。
【００９４】
リーダは、トークン２５ＥｎｄＥｌｅｍｅｎｔ：  Ｍｏｎｓｔｅｒをナビゲータに渡し、ナビゲータは、バッファリングせずにインスタンス化マネージャに転送する。インスタンス化マネージャは、Ｍｏｎｓｔｅｒオブジェクトの生成が完了したことに気付く。インスタンス化マネージャも、トークンストリームのすべてのインスタンス化命令に対応して完了する。
【００９５】
一部のバッファリングが行われたが、バッファリングは、トークンストリーム内のすべてのトークンの数よりも少なかった。本明細書で説明した実施形態を用いて、トークンストリームが、インスタンス化マネージャが通常認識している特定のインスタンス化トークンを処理する方法で書かれていなくても、すべてのトークンストリームのほんの一部をバッファリングしながら一部のトークンストリームを評価することができる。従って、トークンストリームの構造的要件を特に要求することなく、トークンストリームに基づくインスタンス化要求のバッファリングが低減される。
【００９６】
本発明を、その趣旨または不可欠な特性から逸脱せずに他の特定の様式で実装できる。説明した実施形態は、すべての点において、限定するものではなく例として見なされるべきである。従って本発明の範囲は、前述の説明よりはむしろ特許請求の範囲の記載によって示される。特許請求の範囲の意味および同等の範囲に当てはまるすべての変更は、それらの範囲内に含められる。
【図１】
2011510419.tif 000003
【図２】
2011510419.tif 000004
【図３】
2011510419.tif 000005
【図４】
2011510419.tif 000006
【図５】
2011510419.tif 000007
【図６】
2011510419.tif 000008
【国際調査報告】
2011510419.tif 000009
2011510419.tif 000010