JP2007532998A - フラグメントベースのシリアライゼーションのシステムおよび方法 - Google Patents
フラグメントベースのシリアライゼーションのシステムおよび方法 Download PDFInfo
- Publication number
- JP2007532998A JP2007532998A JP2007507295A JP2007507295A JP2007532998A JP 2007532998 A JP2007532998 A JP 2007532998A JP 2007507295 A JP2007507295 A JP 2007507295A JP 2007507295 A JP2007507295 A JP 2007507295A JP 2007532998 A JP2007532998 A JP 2007532998A
- Authority
- JP
- Japan
- Prior art keywords
- data
- fragment
- members
- type
- byte
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/4493—Object persistence
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90348—Query processing by searching ordered data, e.g. alpha-numerically ordered data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Mathematical Physics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
フラグメントベースのシリアライゼーションの方法およびシステムが、1つまたは複数のオブジェクトメンバをフラグメント内に置く。フラグメントに、ヘッダおよびペイロードを含めることができる。ヘッダは、フラグメントタイプの表示およびフラグメント長の表示など、フラグメントに関する有用な情報を提供することができる。ペイロードに、オブジェクトの1つまたは複数のメンバを含めることができる。プリミティブメンバは、レコードフォーマットペイロードを用いてバイナリフラグメントにストアすることができる。LOBメンバおよびFSメンバは、フラグメントの追加プロパティを示す値タイプフィールドを有するフラグメントにストアすることができる。コレクションは、第1フラグメントがコレクションの先頭を示し、1つまたは複数の第2フラグメントがコレクション要素をシリアライズし、ターミネータ(terminator)フラグメントがコレクションの終りを示す、一連のフラグメントにストアすることができる。フラグメントシリアライズされたオブジェクトは、ストレージオーバーヘッドを最小にすると同時に、高速なインスタント化ならびに低コストの突き止めおよび更新を提供する。
Description
本願は、その開示が参照により本明細書に組み込まれている、2004年4月9日出願の米国特許仮出願第10/821687号明細書の優先権を主張するものである。
この特許文書の開示の一部に、著作権保護の対象になる材料が含まれる可能性がある。著作権所有者は、米国特許商標局の書類または記録に現れる特許文書または特許開示の何人による写真複製にも異議を唱えないが、それ以外の全著作権を留保する。次の表示が、この文書に適用される:Copyright(コピーライト)2003、Microsoft Corp.
本発明は、コンピューティングに関し、具体的には、データオブジェクトのストレージおよび伝送に関する。
シリアライゼーションは、オブジェクトインスタンスの状態をストレージ媒体にストアする処理として定義することができる。この処理中に、オブジェクトのパブリックフィールドおよびプライベートフィールドならびにクラスの名前が、バイトのストリームに変換され、次いでこのバイトのストリームが、データストリームに書き込まれる。オブジェクトが、その後にデシリアライズされる時に、オリジナルオブジェクトの正確なクローンを作成することができる。
アクティブなコンピュータメモリ内のオブジェクト、例えば、ある人を記述するデータを有するオブジェクトを検討されたい。この人オブジェクトは、名前、住所、社会保険番号、電話番号、配偶者、身長、および体重など、複数のサブコンポーネントメンバを有する。人の名前は、特定のアプリケーションに重要である場合があるが、身長および体重は、そうでない可能性がある。したがって、名前は、アクティブメモリ内に残され、そこで変更される可能性があるが、身長および体重などの他のフィールドは、他のデータの余地を作るためにアクティブメモリから追い出される。最終的に、人オブジェクトは、もはやアプリケーションに必要でなくなり、永続するか別のコンピュータに伝送される可能性がある。オブジェクトを永続させるか伝送するために、オブジェクトをシリアライズしなければならないが、これは、オブジェクトを有用な取り出し可能な形でフォーマットすることを指す。
上の例では、人オブジェクトなどのオブジェクトのメンバが、一般に、同一クラスのすべてのオブジェクトについて均一である。例えば、各人オブジェクトは、名前、住所、社会保険番号、電話番号、配偶者、身長、および体重の各メンバを有する。情報は、人ごとに変化し、一部の人について、情報が入手不能である(「ヌル」)場合があるが、同一のメンバフィールドの存在が、一般に、人クラスのすべての人オブジェクトについて存在する。したがって、人クラスは、包括的な人オブジェクトと考えることができる。人オブジェクトは、人クラスの1つのインスタンスである。クラスおよびクラスのインスタンスというこの概念は、多数のプログラミング言語に存在する。使用されるプログラミング言語にかかわりなく、シリアライゼーションは、通常、クラスのインスタンスに対して実行され、シリアライズされたオブジェクトが生成される。
オブジェクトに、様々な型のデータを有するメンバを含めることができる。メンバは、プリミティブメンバまたは複合メンバとすることができる。プリミティブメンバの例が、文字のストリングである、人オブジェクトの名前メンバなどの「string」と、整数である、人オブジェクトの社会保険番号などの「integer」である。複合メンバの例が、複数のプリミティブ、例えば複数の整数を含む、電話番号メンバなどの「collection」と、例えば電話番号のコレクションまたは別の人オブジェクトを参照する配偶者メンバなど、単一のプリミティブメンバを超える構造を有するメンバである「nested」と、住所型のサブタイプであり、したがっておそらくは米国の地域または私書箱などの追加メンバを宣言する仮定の「United States address」型などの「subtype」である。メンバは、多数の異なる形で記述することができ、複数のパターンで互いに関係する。したがって、人オブジェクトなどのオブジェクトのシリアライズは、オブジェクトに含まれる可能性がある、様々なメンバおよびこれらのメンバの間の関係を効果的に処理することが含まれる。
オブジェクトのシリアライゼーションは、産業界における複数の課題を提示する。シリアライズされたオブジェクトは、できる限り少ないストレージスペースを消費しなければならない。オブジェクトのサイズが、シリアライズされる時に非常に増える場合に、オブジェクトのストレージコストが、高すぎる可能性がある。したがって、コンパクトな表現が、シリアライゼーションフォーマットの重要な態様である。
また、シリアライズされたオブジェクトは、アクティブメモリに効率的にインスタンス化されなければならない。シリアライズされたオブジェクトの様々なメンバを見つけ、アシミレート(assimilate)することの処理コストが高い場合に、これによって、貴重なプロセッサリソースが奪い去られる。同様に、シリアライゼーションは、オブジェクト全体のインスタンス化を必要としない、オブジェクトのメンバのインスタンス化および更新を可能にしなければならない。例えば、ある人の社会保険番号を読み取るか更新するためだけの人オブジェクト全体のインスタンス化は、名前、電話番号、住所などがその動作に含まれない時に、これらのメンバをストアするのに必要なアクティブメモリリソースの浪費である。
また、シリアライゼーションフォーマットは、オブジェクトに含まれる可能性があるすべてのデータ型をサポートしなければならない。非常に基本的なシリアライゼーションフォーマットは、プリミティブだけをサポートする可能性があるが、より洗練されたフォーマットは、上で説明したnestedメンバ、collectionメンバ、およびsubtypeメンバなどの複合メンバをサポートしなければならない。ほとんどのオブジェクトが、少数のレベルのネスティングおよび継承を有するという特性を有するので、シリアライゼーションフォーマットは、これらのオブジェクトに最適でなければならないが、シリアライゼーションが広範囲のクラスに柔軟に使用できることを保証するために、多数のレベルのネスティングおよび継承もサポートしなければならない。また、シリアライゼーションフォーマットは、非常に多数のメンバを処理する上で柔軟でなければならない。一部のメンバが、例えば音楽ファイル、写真、またはムービーである場合があり、このような大きいメンバは、下で詳細に説明するシリアライゼーションでの課題を提示する。
以前のシリアライゼーションフォーマットは、複数の顕著な欠陥を有する。そのようなフォーマットの1つを、XMLシリアライゼーションと称する。XMLシリアライゼーションは、メンバごとに1つのトークンを提供する。このトークンに、メンバを識別するメタデータ、通常はトークンの直後のメンバが含まれる。したがって、XMLシリアライゼーションは、次のように視覚化することができる。
(トークン1)メンバ1;(トークン2)メンバ2;(トークン3)メンバ3;など
そのようなシリアライゼーションフォーマットに関する問題は、第1に、言葉数の多さである。各すべてのメンバのメタデータトークンのストレージが、大量のディスクスペースを消費する。第2に、そのようなフォーマットでは、取出が損なわれる。というのは、所望のメンバを見つけるために、トークンを検索しなければならないからである。これは、高いアクティブメモリコストを伴う可能性がある。というのは、この形でシリアライズされたオブジェクトを読み取るか更新するかの最も効果的な形が、オブジェクト全体をインスタンス化することになる可能性があるからである。
そのようなシリアライゼーションフォーマットに関する問題は、第1に、言葉数の多さである。各すべてのメンバのメタデータトークンのストレージが、大量のディスクスペースを消費する。第2に、そのようなフォーマットでは、取出が損なわれる。というのは、所望のメンバを見つけるために、トークンを検索しなければならないからである。これは、高いアクティブメモリコストを伴う可能性がある。というのは、この形でシリアライズされたオブジェクトを読み取るか更新するかの最も効果的な形が、オブジェクト全体をインスタンス化することになる可能性があるからである。
もう1つのシリアライゼーションフォーマットが、「SEレコード」または単に「レコード」フォーマットとも称する「ストレージエンジン(Storage Engine)レコード」フォーマットにある。これは、通常のデータベースシステムレコードフォーマットである。このシリアライゼーションフォーマットでは、所与のクラスのオブジェクトのメンバが、均一にフォーマットされたレコードにストアされる。各すべてのメンバを記述するメタデータを提供するのではなく、特定のクラスのオブジェクトのすべてのレコードの内容を記述するメタデータがある。これは、図10のように視覚化することができる。
SEレコードシリアライゼーションフォーマットは、各個々のメンバのメタデータを必要とせず、したがって、よりコンパクトなシリアライゼーション技法である。その代わりに、このフォーマットは、図10のMetadata for Person Objectsテーブルなど、ディスク上のメンバのレイアウトを記述したメタデータへのアクセスを必要とする。SEレコードフォーマットの弱点は、現在オブジェクトと共にストアされる音楽ファイル、ムービー、およびイメージの多くなど、可変長のメンバの処理において柔軟でないことである。より正確にいえば、SEレコードシリアライゼーションの柔軟性は、高い処理コストで得られる。レコード内の可変長データの位置を識別するのにオフセットテーブルが使用される場合に、可変長のメンバをそのようなフォーマットでストアすることができる。オフセットテーブルをストアすることの結果は、可変長データメンバが更新される時に、必ず、それに続くすべての可変長データの位置を調整しなければならないことである。これは、配列の途中にバイトを挿入することになぞらえることができる。すなわち、挿入点の右側にあるすべてのものを右にシフトして、挿入される新しいバイトのスペースを作らなければならない。
さらに、データベースのユーザがデータベースに効率的にオブジェクトをストアできるようにするために、様々なストレージフォーマットが設計されてきた。これらのストレージフォーマットは、より柔軟なシリアライゼーションフォーマットを用いてより良くサポートされることができる。例えば、本明細書で提供するシリアライゼーションフォーマットから区別されなければならない。例えば、ユーザがC#などのオブジェクト指向言語で記述されたクラスおよびメソッドをデータベースに「インポート」できるようにする技術がある(特許文献1(弁理士整理番号−MSFT2852/306819.01、「system and method for object persistence in a database store」)参照)。この技術は、さらに、ユーザが、C#オブジェクトをデータベースにストアし、そのオブジェクトに対してメソッドを呼び出すことができる。この技術は、永続性の複数のフレイバをユーザに提供する。ユーザは、彼自身のシリアライゼーションフォーマットを定義し、CLR(Common Language Runtime)シリアライゼーション(C#言語自体によって提供される)を使用し、またはSQLサーバにそれ自体のフォーマットでオブジェクトをストアさせることができる。これらのオプション、特に後者は、性能の利益をもたらす。というのは、MICROSOFT SQL SERVER(登録商標)が、C#オブジェクトを実際にシリアライズせずに、オブジェクトの一部のフィールドを取り出すか更新することができるからである。もちろん、メソッド呼出しなど、いくつかの動作は、C#オブジェクトのインスタンス化を必要とする。
類似する背景および関連技術の記述がある(特許文献2(弁理士整理番号−MSFT2850/306820.1、「System and Method for Storing and Retrieving a Field of a User Defined Type Outside of a Database Store」)参照)。この特許では、UDT内のファイルストリームが論じられ、このファイルストリームは、本明細書に記載の技法に従ってシリアライズすることができる。そのような高度なデータベース技術は、より柔軟で高性能のシリアライゼーションフォーマットから利益を得ることができる。同様に、シリアライズされたオブジェクトに対して動作を実行する改善された技法は、そのような高度なデータベース技術をより良くサポートする。
したがって、シリアライゼーションフォーマットに伴うトレードオフは、フォーマットのメタデータオンディスクメモリオーバーヘッドと、メンバ突き止めのアクティブメモリオーバーヘッドと、メンバを突き止める処理コストと、更新を行うコストと、大きいファイルを処理する際の柔軟性との間にある。これらのトレードオフに鑑みて、産業界に、シリアライゼーション技法に関する水準を引き上げる、進行中の、したがって対処されてない必要がある。
フラグメントベースのシリアライゼーションの方法およびシステムが、1つまたは複数のメンバをフラグメント内に置く。フラグメントに、ヘッダおよびペイロードを含めることができる。ヘッダは、フラグメントタイプの表示およびフラグメント長の表示など、フラグメントに関する有用な情報を提供することができる。ペイロードに、オブジェクトの1つまたは複数のメンバを含めることができる。オブジェクトメンバをストアし、取り出す際の効率および柔軟性のために、様々なフラグメントタイプを提供する。プリミティブメンバは、レコードフォーマットペイロードを用いてフラグメントにストアすることができる。この構成は、プリミティブの高速な突き止めおよび更新を可能にする。ラージオブジェクト(「LOB」)メンバは、LOBメンバおよびFSメンバの位置の位置タイプを示すフィールドを有するフラグメントにストアすることができる。コレクションは、第1フラグメントがコレクションの先頭を示し、1つまたは複数の第2フラグメントがコレクション要素をシリアライズし、ターミネータ(terminator)フラグメントがコレクションの終りを示す、一連のフラグメントにストアすることができる。これらおよび他のフラグメントタイプを、シリアライゼーションフォーマットに追加の機能性を提供する形で、フラグメントの生成、フラグメント内のメンバの配置、およびフラグメントのシーケンシングを支配するルールに従って編成することができる。
本発明の様々な実施形態の完全な理解を提供するために、ある特定の詳細を、次の説明および図面に示す。しかし、コンピューティング技術にしばしば関連する、ある周知の詳細は、本発明の様々な実施形態を不必要に不明瞭にすることを避けるために、次の開示では示さない。さらに、当業者は、下で説明する詳細の1つまたは複数なしで、本発明の他の実施形態を実践できることを理解するであろう。最後に、次の開示で、ステップおよびシーケンスに関して様々な方法を説明するが、この説明が、本発明の実施形態の明瞭な実施態様を提供するためのものであり、ステップおよびステップのシーケンスを、本発明の実践に必要なものとして解釈してはならない。
本発明の目的は、改善されたオブジェクトシリアライゼーションの方法およびシステムを提供すること、ならびに、シリアライズされたオブジェクトに対する動作の技法を提供することである。これに関して、コンパクトな表現を提供するシリアライゼーションを提供する。提供されるフォーマットでシリアライズされたオブジェクトは、アクティブメモリに効率的にインスタンス化することができ、これによって、シリアライズされたオブジェクトの様々なメンバを見つけ、アシミレートする処理コストを減らすことができる。同様に、オブジェクトのメンバを、オブジェクト全体をインスタンス化する必要なしにインスタンス化し、更新することができる。さらに、ユーザ定義データ型(「UDT」)を含む広範囲のデータ型のサポートが提供される。このシリアライゼーションフォーマットは、少数のレベルのネスティングおよび継承を有するオブジェクトのために最適化することができるが、多数のレベルのネスティングおよび継承もサポートすることができる。このシリアライゼーションフォーマットは、非常に多数のメンバを扱う際に柔軟である。本発明は、単一の列での様々な型のストレージに適するシリアライゼーションフォーマットを提供することができ、例えば、「person(人)」オブジェクトのサブタイプである「employee(従業員)」オブジェクトを、「person」オブジェクトだけをストアするために設けられた列にストアすることができる。最後に、このシリアライゼーションフォーマットは、効率的な型エボリューション(type evolution)とも呼ばれる、型への新しいメンバの効率的な追加を可能にする。
本発明の様々な実施形態によるフラグメントベースのシリアライゼーションは、フラグメントベースのシリアライゼーション自体に独特の多数の態様および長所に加えて、背景で説明したXMLスタイルシリアライゼーションの要素の一部と、やはり背景で説明したSEレコードシリアライゼーションの要素の一部とを使用するハイブリッドフォーマットとして概念化することができる。これに関して、オブジェクトのメンバを、フラグメントに置くことができる。フラグメントを、図1に示す。
図1を参照すると、フラグメントに、ヘッダと、いくつかの場合にペイロードを含めることができる。ヘッダは、フラグメントタイプの表示およびフラグメント長の表示など、フラグメントに関する有用な情報を提供することができる。このヘッダは、XMLシリアライゼーションによって提供されるトークンに多少似ている。というのは、XMLシリアライゼーションコンテキストのメンバごとにトークンが提供されるのと同様に、新しいヘッダが、フラグメントごとに与えられるからである。しかし、XMLトークンは、ヘッダごとに設けられるが、図1のフラグメントには、複数のメンバを含めることができる。これが、フラグメント1に示されており、フラグメント1は、複数のデータメンバを含むペイロードを有するフラグメントを示す。フラグメントベースの方法は、単純なプリミティブフィールド(整数、ストリングなど)を有するオブジェクト、接続されたオブジェクトのグラフ全体、およびコレクションを含むがこれに制限されない、様々なデータ構造をシリアライズし、デシリアライズすることができる。
フラグメントペイロードに、シリアライズされたオブジェクトの1つまたは複数のメンバ、ならびに任意の他のデータを含めることができる。このペイロードは、その中のメンバにSEレコードフォーマットスタイルのシリアライゼーションを使用することができ、これによって、ペイロード内のメンバの素早い取出が可能になる。そのようなレコードフォーマットペイロードは、図1のフラグメント1の特性である。これに関して、フラグメントベースのシリアライゼーションは、SEレコードシリアライゼーションの特徴を有する。メタデータを、ヘッダで、またはペイロードに含まれるフィールドを記述する他の場所で提供することができる。したがって、コンパクトな表現およびオブジェクト全体をインスタンス化せずに個々のメンバを取り出すことの対応する利点を達成することができる。ペイロードを、レコードフォーマットとすることができるが、フラグメント2および3に示されているように、そうする必要がないことに留意されたい。
フラグメントのヘッダ部分に、図2に示されているように、様々なフィールドを含めることができる。図2に、様々な可能なフィールドを示すことができるように、拡張ヘッダセクションを有するフラグメントを示す。図2で提供される様々なフィールドを、すべてのフラグメントに含める必要がないことに留意されたい。その代わりに、フラグメントのペイロードに関する有用な情報を提供するフィールドを、ヘッダに含めることができる。図2の様々なフィールドを、フラグメントの様々な提案されるタイプの説明と共に、下でより詳細に説明する。
本発明の様々な実施形態では、オブジェクトをシリアライズする際の追加の多用途性のために、複数のタイプのフラグメントを使用する。様々な提案されるフラグメントタイプを、下で示す。しかし、フラグメントタイプを説明する前に、異なるフラグメントタイプを使用する動機づけを検討されたい。1つの動機づけ要因は、オブジェクトを構成することができる様々なタイプのメンバのより良いシリアライゼーションを可能にすることである。背景セクションから、オブジェクトに、頻繁に、異なる型の複数のメンバが含まれることを想起されたい。このメンバに、例えば、次を含めることができる。
・ 小さいプリミティブメンバ。これは、整数(「int」)、float、およびstringなどの基本型のメンバである。
・ ラージオブジェクト(「LOB」)およびファイルストリーム(「FS」)などの大きいプリミティブメンバ。
・ CollectionおよびNestedなどの複合メンバ。
・ サブタイプメンバ。継承をサポートするすべてのクラスが、継承されたメンバを含むクラスのインスタンスを有することができ、この継承されたメンバを、サブタイプのデータとすることができる。
上記は、潜在的なメンバタイプの網羅的ではないリストであり、すべてのメンバタイプが、本明細書で説明するフラグメントベースのシリアライゼーション技法と共に使用することに関する候補と考えられる。
フラグメントタイプ
シリアライズされる1つのオブジェクトに存在する可能性がある様々なタイプのメンバに対処するために、本発明を、複数のフラグメントタイプと共に使用することができる。1つまたは複数のフラグメントタイプが、メンバの1つのタイプだけに有用である場合があり、他のフラグメントタイプが、複数のメンバタイプに有用である場合がある。
シリアライズされる1つのオブジェクトに存在する可能性がある様々なタイプのメンバに対処するために、本発明を、複数のフラグメントタイプと共に使用することができる。1つまたは複数のフラグメントタイプが、メンバの1つのタイプだけに有用である場合があり、他のフラグメントタイプが、複数のメンバタイプに有用である場合がある。
様々なフラグメントタイプが、そのフラグメントの内容に合わせて調整された異なるフォーマットを有することができる。次の議論では、まずフラグメントタイプを示し、そのタイプの提案されるフラグメントフォーマットの視覚的描写を続ける。斜体のフラグメント属性は、任意選択であり、タイプ列の値に依存する。本発明は、下で示すフラグメントタイプに制限されない。本明細書で提供するフラグメントの他に、本明細書で提供するフラグメントベースのシリアライゼーションの一般定原理に従う使用のために新しいフラグメントタイプを開発することができる。
バイナリフラグメント−図11(A)に、バイナリフラグメントの様々な潜在的実施形態を示す。このフラグメントに、タイプフィールド、長さフィールド、およびペイロードフィールドが含まれる。タイプフィールドは、単に1つのバイトとすることができ、あるいは、任意の個数のバイトとすることができる。タイプフィールドの追加バイトは、そのシリアライゼーションフォーマットを使用する時に追加のメモリオーバーヘッドを必要とする。したがって、ヘッダフィールド内のバイトは、倹約して使用されなければならない。これに関して、1バイトのタイプフィールドに、フラグメントの様々なプロパティを示すのに使用される複数のビットを含めることができる。1つのビットを、フラグメントがバイナリフォーマットであることを示すのに使用することができる。もう1つのビットを、フラグメントに含まれる1つまたは複数のメンバのタイプを示すのに使用することができる。例えば、すべてのメンバがプリミティブである場合に、あるビットをセットして、そのような情報を示すことができる。メンバがサブタイプメンバである場合に、あるビットをセットして、それを示すことができる。バイナリフォーマットが、シリアライズされたオブジェクトの最初のまたは唯一のフラグメントである場合に、タイプフィールドの1つのビットが、それを示すことができる。タイプフィールドは、1つまたは複数のフラグメントに含まれるオブジェクトタイプならびに、オブジェクト全体のフラグメントの個数およびタイプなどの追加の有用な情報を示すこともできる。
単一のバイナリフラグメント内で表現されるオブジェクトに、タイプフィールドで「自己終端」フラグメントとしてフラグを立て、シリアライズされたオブジェクトの終りにターミネータフラグメントを含める必要をなくすことができる。この「自己ターミネータ」フラグは、フラグメントのタイプフィールドの自己ターミネータビットの形とすることができる。そのような自己ターミネータビットは、フラグメントヘッダの他のフィールドに、またはフラグメントペイロード内に置くこともできる。複数のフラグメントによって表されるオブジェクトは、自己ターミネータビットをセットする必要がない。というのは、ターミネータフラグメントを生成して、シリアライズされたオブジェクトの終りをマークすることができるからである。
長さフィールドは、最適には2バイトであるが、この長さは、上で説明したように変更することができる。長さフィールドは、ペイロードの長さを示すのに使用することができる。バイナリフラグメントのペイロードに、どのデータでも含めることができる。好ましい実施形態では、ペイロードに、オブジェクトのすべてのプリミティブメンバが含まれる。そのようなフラグメントのペイロードは、SEレコードとして、そこにストアされたプリミティブまたは他のメンバの効率的なクラッキングおよび更新を可能にすることができる。
LOBフラグメント−図11(B)に、LOBフラグメントの様々な潜在的な実施形態を示す。このフラグメントは、ヘッダ内のタイプフィールド、値タイプフィールド、および長さフィールドと、LOBまたはLOBの位置情報を含むペイロードとを有することができる。タイプフィールドは、フラグメントのそれぞれと同様に、この場合にフラグメントがLOBフラグメントであることを示す1バイトであることだけが必要である。値タイプフィールドは、LOBフラグメントの内容を記述する追加の手段を提供することができる。そのような値タイプフィールドは、LOB属性のためにタイプフィールドのビットを使い切ることが望ましくない実施形態で、LOB属性に関する情報を含めるために追加することができる。この形では、LOBフラグメントだけがオーバーヘッド(ここでは、フラグメントごとに1つの追加のバイト)を有する。
値タイプフィールドにストアされる情報は、LOBがストアされる位置のタイプを記述することができる。LOBメンバの位置の追加記述を可能にすることによって、大きい値の処理における柔軟性が提供される。LOBデータ(LOB参照ではなく)がLOBフラグメントにストアされる場合に、アプリケーション(またはコンピュータのユーザ)が、LOB Inlinedタイプフラグメントの生成を開始し、8バイトの長さを使用し、LOBをインラインに置くことができる。言い換えると、LOBを、LOBフラグメントのペイロードに置くことができる。値タイプフィールドが、LOB Inlinedタイプを示す場合に、長さフィールドを、例えば8バイトとすることができ、ペイロードに、LOB値を含めることができる。
LOBをシリアライズされたオブジェクトとインラインで含めることは、必ずしも望ましくない場合がある。これは、LOBが、大量のスペースを占める可能性があるからである。したがって、値タイプフィールドは、LOB Pointerタイプを示すことができ、このタイプは、フラグメントのペイロードに、LOB位置へのポインタが含まれることを意味する。このシナリオでは、長さフィールドを、例えば2バイトとすることができ、ペイロードに、LOB参照を含めることができる。値タイプフィールドは、LOB Delayedタイプを示すこともでき、このタイプは、フラグメントペイロードに、おそらくはLOBを含むデータベース内のセルへのLOB参照が含まれることを意味することができる。この代替シナリオでは、フラグメント長を、例えば2バイトとすることができ、ペイロードに、セル参照を含めることができる。「セル参照」は、テーブル識別子、行識別子、および列識別子の組み合わせである。LOBフラグメントの「パス」(下で説明する)と組み合わされた時に、セル参照は、実際のLOBデータを突き止めるのに十分な情報を与える。他の位置タイプ情報を、LOBフラグメントまたはFSフラグメントの値タイプフィールドに含めることができる。LOBフラグメントおよびFSフラグメントのそのような追加の位置タイプフィールドを提供することによって、シリアライゼーションフォーマットに追加の柔軟性が与えられると同時に、オーバーヘッドが低く保たれる。
本明細書で論ずるフラグメントのどれであっても、特定のオブジェクトが特定のクラスのシリアライゼーションで提供されるメンバを有しない場合に、ヌルにすることができることに留意されたい。フラグメントがヌルである場合に、この情報を、フラグメントのタイプフィールドの1ビットにセットすることができる。これに関して、長さフィールドおよびペイロードを、図11(B)のLOBフラグメントから除去して、位置が値タイプフィールドで指定されるヌルLOBフラグメントを形成することができる。
FS(ファイルストリーム)フラグメント−図11(C)に、FSフラグメントの様々な可能な実施形態を示す。すべてのフラグメント同様に、FSフラグメントは、フラグメントタイプ(この場合にはFSフラグメント)を示すタイプフィールドを有することができる。LOBフラグメントと同様に、FSフラグメントに、値タイプフィールドを含めることができる。やはり、このフィールドは、FSの様々な位置タイプを示すことができる。FSは、オブジェクトの残りと共にシリアライズするすなわち、インラインタイプとすることができる(やはり、これは、より大きい長さフィールド、例えば8バイトと相関することができる)。値タイプフィールドは、フラグメントペイロード内でポイントされる位置すなわちFSポインタタイプとすることができ、これは、FSに関して、例えば2バイトの長さフィールドと、適当なFSファイルのグローバル一意識別子(「GUID」)を含むペイロードを示すことができる。値タイプフィールドは、FS Delayed位置タイプを示すこともでき、これは、例えば2バイトの長さと、セル参照を含むペイロードに相関することができる。
ターミネータフラグメント−図11(D)に、ターミネータフラグメントの様々な可能な実施形態を示す。フラグメントベースシリアライゼーションの好ましい実施形態では、タイプバイトだけが、ターミネータフラグメントに関係する。これは、ターミネータフラグメントの機能が、シリアライズされたオブジェクトの終りをマークすること、またはシリアライズされたオブジェクト内の関連するフラグメントのコレクションまたは他のセットの終りをマークすることであるからである。ターミネータフラグメントは、それがターミネータフラグメントであることを示すタイプフィールドによってこの機能を実行することができ、追加情報を含める必要はない。しかし、ターミネータフラグメントに追加情報を含めることが有用である場合があり、そのような実施形態は、確かに本明細書に記載の発明の範囲に含まれる。
コレクション開始フラグメント−図11(E)に、コレクション開始フラグメントの様々な可能な実施形態を示す。このフラグメントには、タイプフィールドと、例えば2バイトの、ビットフィールドを含めることができる。タイプフィールドは、このフラグメントがコレクション開始フラグメントであることを示すことができる。ビットフィールドは、コレクションのプロパティを示すことができる。例えば、ビットフィールドは、「順序付けされない」コレクションを示すことができ、これは、特定の順序ではないコレクションに対応することができる。ビットフィールドは、「順序付けされた」コレクションを示すこともでき、これは、コレクションが特定の順序であることを示す。このフラグメントは、コレクションを記述する目的だけに使用される場合に、長さフィールドを省略することができる。というのは、コレクション開始フィールドが、コレクションの始まりをマークするからであり、したがって、ペイロードを含む必要がないからである。コレクション開始フラグメントに含まれるペイロードがある場合には、そのペイロードを記述する長さフィールドを有することができる。しかし、本明細書に記載の好ましい実施形態では、コレクション開始フラグメントが、コレクションのマークおよび記述に使用され、それ自体のペイロードを持たず、したがって、長さフィールドを有する必要がない。したがって、ヌルコレクション開始フラグメントは、図11(E)のコレクション開始フラグメントに非常に似て見える。コレクション開始フラグメントがヌルである状況での唯一の相違は、上でヌルLOBフラグメントに関して説明したように、タイプフィールド内でセットされるビットである。
コレクション要素フラグメント−図11(F)に、コレクション要素フラグメントの様々な可能な実施形態を示す。そのようなフラグメントのタイプフィールドは、それがコレクション要素フラグメントであることを示すことができる。長さフィールドは、コレクション要素フラグメントのペイロードの長さを示すことができる。図11(F)に、2バイトの例示的な長さフィールドサイズを示すが、これは、コレクション要素を含むペイロードの長さを示すのに十分であろう。
ロケータフィールドも、コレクション要素フラグメントに含めることができる。ロケータフィールドは、LOBフラグメントおよびFSフラグメントの値タイプフィールドと同様に、コレクション要素フラグメントの追加プロパティを示すのに使用することができる。例えば、コレクション要素フラグメントは、バイナリフラグメントのペイロードのように、SEレコードフォーマットのペイロードを有することができる。タイプフィールドは、フラグメントがそれ自体を終端するかどうかを示すビットを使用することによって、コレクション要素フラグメントが自己ターミネータであるかどうかを示すことができる。自己ターミネータビットがセットされていない場合には、システムは、フラグメントのターミネータフラグメントを予期することができる。ロケータフィールドは、FSフラグメントのGUIDに非常によく似て、コレクションの特定の要素をアドレッシングするのに使用することができる。しかし、コレクション要素フラグメントの場合に、ロケータフィールドは、必ずしもグローバルに一意の位置ではなく、コレクション内の一意の位置を示す。
ロケータフィールドに関して、コレクション要素内のロケータフィールドのある予期を可能にすることも好ましい場合がある。コレクション開始フラグメントのビットフィールドのビットをセットして、やがて来るロケータフィールドを有するコレクション要素フラグメントを示すことができる。そのような構成では、ロケータフィールドがコレクション要素フラグメントに存在することを演繹するようにシステムを構成することができる。
ヌルコレクション要素フラグメント−図11(H)に、ヌルコレクション要素フラグメントの様々な可能な実施形態を示す。コレクション要素フラグメントのヌル表現に、そのフラグメントがヌルコレクション要素フラグメントであることを示すタイプフィールドを含めることができる。ヌルコレクション要素フラグメントに、ロケータフィールドを含めることもできるが、長さフィールドまたはペイロードフィールドを含める必要はない。というのは、特定のシリアライズされたオブジェクトが、そうでなければそのようなデータを含むように設計されたクラスの特定の態様に対応するデータを有しないことが、ヌルコレクション要素フラグメントの存在によって示されるからである。やはり、メンバまたは他のメンバ情報がペイロードに含まれない場合に、ペイロードの長さを記述する長さフィールドの必要がないものとすることができる。
ヌルフラグメント−図11(G)に、ヌルフラグメントの様々な可能な実施形態を示す。ヌルフラグメントは、ターミネータフラグメントと同様に、単一のタイプフィールドによって表すことができる。やはり、これは、非コレクション要素ヌルフラグメントの表現に制限することができる実践である。コレクション要素ヌルフラグメントの説明については、下を参照されたい。
注釈フラグメントおよびメタデータフラグメント−上で説明した他のフラグメントの他に、メタデータフラグメントおよび注釈フラグメントを使用して、シリアライズされたオブジェクトの受取り側に1つまたは複数のフラグメントを説明することができる。そのようなフラグメントは、それらがオブジェクトのデシリアライズに必要でない可能性がある場合であっても、様々な状況で有用である。例えば、注釈フラグメントは、クライアントが特定のメンバまたはオブジェクトに関する情報を検査すること、またはシリアライズされたオブジェクトに関するメモまたは情報を挿入することを可能にすることができる。
結論として、上で示した様々なフラグメントの説明を参照すると、効果的なシリアライゼーションフォーマットによって達成される利点の1つは、表現オーバーヘッドの削減である。表現オーバーヘッドは、オブジェクトを効果的に取り出せるようにするためにオブジェクトと共にストアされる追加情報の量を指す。フラグメントベースのシリアライゼーション技法には、表現オーバーヘッドが含まれるが、そのオーバーヘッドは、このフォーマットの対応する柔軟性および機能性について最小化されている。
フラグメントヘッダの最初のフィールドは、タイプフィールドである。好ましい実施形態では、タイプフィールドが、1バイトを消費する。これによって、関連するオーバーヘッドが最小になる。さらに、コレクション要素フラグメントに関連するロケータフィールドが、オーバーヘッドになる。ほとんどの小さい順序付けられないコレクションは、4バイトしか消費しないロケータフィールドで適当に表現することができる。しかし、より大きい順序付けられたコレクションは、5バイト以上を消費する可能性があり、この場合に、ロケータフィールドを、より大きい表現オーバーヘッドを必要とする可能性がある可変バイナリ(「varbinary」)フィールドに置換することができる。ロケータフィールドによって使用されるオーバーヘッドの正確な量は、実装詳細と考えられ、当業者の判断に委ねられるが、当業者は、表現オーバーヘッドを減らすがコレクションの柔軟なシリアライズも可能にすることの動機づけを諒解するであろう。最後に、複数の他のフラグメントタイプ(上を参照されたい)に関連する長さフィールドが、表現オーバーヘッドである。上で説明したように、好ましい実施形態の長さフィールドは、フラグメントタイプに応じて、2バイトまたは8バイトのいずれかの長さとすることができる。本発明は、そのようなフィールドの正確なバイト数に制限されず、本明細書で示したパラメータは、経験を積んだ実務家からの有用なヒントと考えられるべきであり、本発明自体の厳重な要件ではない。
フラグメントにメンバを置くルール
上で説明したように、様々なフラグメントタイプが、様々なフラグメントメンバを処理することができる。オブジェクトをシリアライズするために、特定のメンバにどのフラグメントタイプを使用するかに関する判断を行わなければならない。例えば、プリミティブメンバ、ネストされたメンバ、コレクションメンバ、およびサブタイプメンバを含むオブジェクトを、ルールのセットに従ってフラグメントに分解することができる。本発明は、フラグメントタイプとメンバタイプの特定の相関に制限されないが、有用なルールのセットが開発されており、これをこのセクションで説明する。このルールが、説明を明瞭にするためのものであって、これらを特定の順序で実行しなければならないことを示すためのものでないことに留意されたい。実際には、下のルールに対応する動作を、オブジェクトのメンバを介するプロセッサステップとして行われるフラグメントの生成、取り込み、およびシーケンシングと同時に実行することができる。オブジェクトのシリアライゼーションに対するこれらのルールの例示的な適用について、図3と下の対応するテキストを参照されたい。ルールは、次の通りである。
上で説明したように、様々なフラグメントタイプが、様々なフラグメントメンバを処理することができる。オブジェクトをシリアライズするために、特定のメンバにどのフラグメントタイプを使用するかに関する判断を行わなければならない。例えば、プリミティブメンバ、ネストされたメンバ、コレクションメンバ、およびサブタイプメンバを含むオブジェクトを、ルールのセットに従ってフラグメントに分解することができる。本発明は、フラグメントタイプとメンバタイプの特定の相関に制限されないが、有用なルールのセットが開発されており、これをこのセクションで説明する。このルールが、説明を明瞭にするためのものであって、これらを特定の順序で実行しなければならないことを示すためのものでないことに留意されたい。実際には、下のルールに対応する動作を、オブジェクトのメンバを介するプロセッサステップとして行われるフラグメントの生成、取り込み、およびシーケンシングと同時に実行することができる。オブジェクトのシリアライゼーションに対するこれらのルールの例示的な適用について、図3と下の対応するテキストを参照されたい。ルールは、次の通りである。
フラグメントを生成する。本発明の実施形態は、タイプベースコンテナ相対フラグメント生成にかかわると言うことができる。言い換えると、次のそれぞれについて1つのフラグメントを設けることができる。
・ レベルがヌルである場合であっても、クラス内のネスティングのレベルごとに
・ コレクションがヌルである場合であっても、コレクションごとに
・ コレクションの要素ごとに
・ サブタイプごとに
・ LOB属性ごとおよびFS属性ごとに。ヌルの場合であっても。LOB値は、インラインにストアすることができるが、FS値は、アウトオブラインでストアしなければならない。
・ コレクションがヌルである場合であっても、コレクションごとに
・ コレクションの要素ごとに
・ サブタイプごとに
・ LOB属性ごとおよびFS属性ごとに。ヌルの場合であっても。LOB値は、インラインにストアすることができるが、FS値は、アウトオブラインでストアしなければならない。
特定のクラスの必要に合わせて、追加のフラグメントを生成することができる。同様に、上のフラグメントが、あるクラスのシリアライズに必要でない場合がある。
一般に、オブジェクトは、トップダウン技法を使用して、フラグメントベースのシリアライゼーションフラグメントに変換することができる。まず、オブジェクトのすべての基本型メンバをシリアライズし、それに続いてサブタイプをシリアライズすることができる。すべてのネスティングレベルで、ネストされた型、サブタイプ、またはLOB/FSタイプメンバがあるかどうかを判定するために、含まれるメンバについてスキャンを行うことができる。
プリミティブメンバのフラグメントの生成。プリミティブメンバの一部またはすべてを、1つまたは複数のバイナリフラグメントに置くことができる。好ましい実施形態では、ネストされたメンバを有しないオブジェクトを、ネストされたメンバを有するオブジェクトと異なる形で扱う。この2つのシナリオを、図4および図5に示す。両方の状況で、ネストされていないプリミティブを、単一のバイナリフラグメントの中に置き、SEレコードフォーマットを使用してその中でシリアライズすることができる。ネストされたメンバがないオブジェクトについて、バイナリフラグメントを生成することができ、ネストされたメンバがないことの表示を、そのフラグメントのタイプフィールドに置くことができる。様々な実施形態で、ネストされたメンバを含むオブジェクトとネストされたメンバを含まないオブジェクトの間の実際的な差は、ネストされたメンバを有するオブジェクトを複数のフラグメントにシリアライズすることができるが、ネストされたメンバがないオブジェクトを単一のバイナリフラグメントにシリアライズすることができることである。したがって、ネストされたメンバがない場合に、バイナリフラグメントのフィールドで、自己ターミネータビットをセットすることができる。バイナリフラグメントの長さフィールドは、組み合わされたプリミティブメンバの長さに対応するようにセットすることができる。次に、フラグメントを発することができる。
図5を参照すると、ネストされたフラグメントがある場合に、バイナリフラグメントに関するネストされたメンバなしの処理を多少変更して、ネストされたメンバを再帰的にシリアライズすることを可能にすることができる。この状況では、自己ターミネータビットをセットする必要はない。バイナリフラグメントを発した後に、nestedタイプのメンバを、それ自体のフラグメントに再帰的に処理することができる。そのような再帰からリターンする時に、ターミネータフラグメントを生成することができる。その後、ターミネータフラグメントも発することができる。
コレクションのフラグメントの生成。コレクションフラグメントを生成する処理の流れ図を、図6に示す。コレクションメンバに出会った時に、コレクション開始フラグメントを生成することができる。コレクションが順序付けられていない場合には、ビットフィールドのビットを、「順序付けられない」にセットすることができる。次に、下で説明するように、コレクション要素フラグメントを生成することによって、コレクションの各要素を再帰的にシリアライズすることができる。すべての要素をシリアライズした後に、ターミネータフラグメントを生成して、コレクションの終りを示すことができる。
コレクション要素は、1つまたは複数のフラグメントにシリアライズすることができる。コレクション要素が、複数のフラグメントを使用して表される場合に、その表現は、それ自体のターミネータフラグメントを有することができる。コレクション要素の最初のフラグメントに、ロケータフィールドを含めることができる。そのようなフィールドの目的の1つを、コレクションをシリアライズする時に処理される要素の数を記憶することとすることができる。シリアライゼーションに関する現在の要素を正しく示すようにロケータフィールドのカウンタを増分することによって、シリアライゼーションプロセスが、コレクションの次の要素をシリアライズするために正しい位置に戻れるようになる。
LOBフラグメントおよびFSフラグメントの生成。LOBメンバおよびFSメンバのフラグメントの生成を示す流れ図を、図7に示す。様々なフラグメントタイプの説明で示したように、LOBフラグメントおよびFSフラグメントの両方を、対応するペイロードの複数の位置タイプを示すように構成することができる。この表示は、値タイプフィールドで行うことができる。例えば、値タイプフィールドによって、ポインタタイプ、inlinedタイプ、またはdelayed locationタイプを含むものとしてペイロードを記述することができる。LOBフラグメントおよびFSフラグメントを生成する際に、適当な値タイプを、メンバから判定することができる。例えば、LOBがオブジェクトと共にシリアライズされる、すなわち、フラグメントとインラインでストアされる場合に、LOB Inlineの値タイプを選択することができ、LOBをそれ相応にシリアライズすることができる。その代わりに、LOBが、シリアライズされたオブジェクトと共にではなくデータベースのセルにストアされる場合に、LOB参照をオブジェクトと共にシリアライズすることができ、適当な位置タイプを値タイプフィールドにストアすることができる。その後、フラグメントを発することができる。
サブタイプフラグメントの生成。サブタイプフラグメントは、他の非プリミティブメンバのフラグメントと同一の形で生成することができる。言い換えると、サブタイプが、コレクションメンバを含む場合に、コレクション要素フラグメントおよびターミネータフラグメントと共にコレクション開始フラグメントを生成して、サブタイプメンバのシリアライゼーションの終りをマークすることができる。サブタイプメンバがネストされたLOBメンバである場合には、LOBフラグメントを生成して、サブタイプメンバを含めることができる。バイナリフラグメントが、サブタイプのために生成され、これには、基本型についてバイナリフラグメントが生成されるのに似た形で、int、floatなどのサブタイプ内のすべての小さいプリミティブメンバが含まれる。
他のフラグメントの生成。本明細書で説明する技法を、特定のオブジェクトまたはオブジェクトのクラスのシリアライゼーションに望まれるか要求される可能性がある他のすべてのフラグメントの生成に外挿することができる。
フラグメントへの取り込み。フラグメントを実際に生成し、それと同時にフラグメントに取り込むことができるが、本発明のこの態様の説明のために、フラグメントにどのように取り込むかの全体的なプランを含めることが有用である。この全体的なプランを、図8に示す。メンバを様々なフラグメントタイプに置く際に、次の提案を観察することができる。
・ LOBメンバを除くすべてのプリミティブメンバを、バイナリフラグメントにストアすることができる。このフラグメントのヘッダに、オブジェクト全体の型識別子を含めることができる。このフラグメントのペイロードに、ストレージエンジンレコードを含めることができる。フラグメントは、プリミティブ属性だけを含む場合に、それ自体を終端すると言われる。
・ 各LOBメンバは、LOBフラグメントにストアすることができる。
・ コレクション開始フラグメントを、コレクションメンバごとに生成することができる。コレクションメンバが空でない場合に、コレクション開始フラグメントは、1つまたは複数のコレクション要素フラグメントを参照することができる。
・ コレクション要素フラグメントは、コレクションメンバの様々な要素について提供される。このフラグメントは、ロケータを伴うバイナリフラグメントとすることができる。ロケータは、コレクション要素をアドレッシングするのに用いることができるラベルである。
・ ターミネータフラグメントを、複数のフラグメントに分解されたコレクションメンバごとに生成することができる。ターミネータフラグメントは、コレクションメンバの終りをマークする。
・ ネストされたフラグメントを有するフラグメントは、それ自体を終端しない。その代わりに、このフラグメントは、このフラグメント内でネストされたすべてのフラグメントの後に現れるターミネータフラグメントを有する。
・ ターミネータフラグメントを、複数のフラグメントに分解されたオブジェクトごとに生成することができる。ターミネータフラグメントは、シリアライズされたオブジェクトの終りをマークすることができる。
・ ネストされたオブジェクトは、上と同一のルールに再帰的に従うことができる。
・ シリアライゼーションにおいて、サブタイプは、ネストされたオブジェクトとして扱われる。
フラグメントのシーケンス。フラグメントは、特定のクラスのシリアライゼーションを構成するシーケンスでストアされる。オブジェクトのクラスに、プリミティブメンバだけが含まれる場合に、そのオブジェクトを、自己終端型の単一のフラグメントにシリアライズすることができる。複合メンバまたは他の非プリミティブメンバを有するクラスは、複数のフラグメントにシリアライズすることができる。あるクラスのシリアライゼーションに複数のフラグメントが含まれる場合に、1つまたは複数のターミネータフラグメントも生成することができる。開始フラグメントから最後のターミネータフラグメントまでのフラグメントのセットに、この説明で使用される意味でのフラグメントのシーケンスが含まれる。
あるインスタンスのサブタイプに対応するフラグメントは、基本型のフラグメントの下でネストすることができる。図3のtPerson、tEmployee、およびtPartTimeEmployeeの例を使用し、当面、各レベルにバイナリフラグメントによって記述されるプリミティブ属性だけがあると仮定すると、tPartTimeEmployeeのインスタンスを、図12によって提供される図で視覚的に示すことができる。図12のtEmployeeおよびtPartTimeEmployeeのフラグメントを、ネスティングの同一のレベルに置くことができることに留意されたい。
シリアライゼーションの例
複数の潜在的なメンバ型、複数のフラグメントタイプ、およびフラグメントにメンバを置く例示的なルールのセットを示したので、本明細書で説明するシリアライゼーションフォーマットの実施形態を使用するシリアライズの例が有益になる。これに関して、図3に、複数の例のスキーマを示す。各スキーマは、オブジェクトのクラスを表し、それぞれが、様々な型の1つまたは複数のメンバを有する。この議論において、図3は、それぞれが名前ストリング(プリミティブメンバ)、年齢整数(やはりプリミティブメンバ)、および位置コレクション(これはネストされた複合メンバ)を有する、「person」オブジェクトのクラスを提供する。図3は、それぞれが3つのプリミティブメンバ、street(通り)、city(都市)、およびzip(郵便番号)を有する「address」オブジェクトを定義するクラスも提供する。図3は、personクラスを継承し、したがってpersonクラスのメンバを含み、3つのプリミティブメンバ、すなわちemployee number(従業員番号)、department(部署)、およびphoto(写真)(イメージはLOBメンバである)も含むemployee(従業員)オブジェクトのクラスを提供する。part−time employee(パートタイム従業員)クラスは、employeeクラスを継承し、したがって、employeeクラスのすべてのメンバ(personクラスから継承したメンバを含む)と、1つのプリミティブ、hours per week(週ごとの労働時間)を含む。
複数の潜在的なメンバ型、複数のフラグメントタイプ、およびフラグメントにメンバを置く例示的なルールのセットを示したので、本明細書で説明するシリアライゼーションフォーマットの実施形態を使用するシリアライズの例が有益になる。これに関して、図3に、複数の例のスキーマを示す。各スキーマは、オブジェクトのクラスを表し、それぞれが、様々な型の1つまたは複数のメンバを有する。この議論において、図3は、それぞれが名前ストリング(プリミティブメンバ)、年齢整数(やはりプリミティブメンバ)、および位置コレクション(これはネストされた複合メンバ)を有する、「person」オブジェクトのクラスを提供する。図3は、それぞれが3つのプリミティブメンバ、street(通り)、city(都市)、およびzip(郵便番号)を有する「address」オブジェクトを定義するクラスも提供する。図3は、personクラスを継承し、したがってpersonクラスのメンバを含み、3つのプリミティブメンバ、すなわちemployee number(従業員番号)、department(部署)、およびphoto(写真)(イメージはLOBメンバである)も含むemployee(従業員)オブジェクトのクラスを提供する。part−time employee(パートタイム従業員)クラスは、employeeクラスを継承し、したがって、employeeクラスのすべてのメンバ(personクラスから継承したメンバを含む)と、1つのプリミティブ、hours per week(週ごとの労働時間)を含む。
図3を参照して、この図のスキーマのインスタンスが、上で提供したフラグメントおよびルールを使用してどのようにシリアライズされるかを検討されたい。例えば、空でない住所のコレクションを有するtPersonのインスタンスは、次のフラグメントを次の順序で有することができる。
住所の空でないコレクションを有するtEmployeeのインスタンスは、次のフラグメントを次の順序で有することができる。
上の例示的なフラグメントシーケンスに関して、1つまたは複数のフラグメントでレコードフォーマットを利用する実施形態で望まれる可能性があるように、ストレージエンジンレコード作成/クラッキングコードの再利用をサポートするために、本明細書に記載のフラグメントベースシリアライゼーション技法と共に使用されるクラスのレベルが、サイズにおいて7キロバイト(7k)を超えないことを要求することが好ましいことに留意されたい。上に示した例では、tPerson(関連する住所のコレクションを除く)が、サイズにおいて7キロバイト未満でなければならない。同様に、各tAddressは、7k未満でなければならない。この制限は、本発明を実践する最良の態様を示す法的要件に従うために開示されるが、本発明の実施にはより望ましくないものの、7kを超えるレベルを許容することが実現可能であることに留意されたい。この制限は、シリアライゼーションライブラリ(「SL」)によって、実行時に実施することができる。理解されるように、シリアライゼーションは、様々なフラグメントを認識し、解析する責任を負う。
上の例から、1つまたは複数のフラグメントにメンバを置くことによって、メンバを突き止める作業に、そのメンバが置かれた1つまたは複数のフラグメントを突き止めることが含まれることに留意されたい。そのようなフラグメントが複数ある場合に、最初のフラグメントを、最初に突き止めることができる。これに関して、シリアライゼーションの最初のフラグメントに対するフラグメントの位置を、メタデータから判定することができる。この技法は、フラグメントの直接のアドレッサビリティを提供しないが、関連するメンバが表すクラスの態様を識別するために各メンバのトークンを比較するという作業が、除去される。その代わりに、スキャンされる時に、シリアライゼーションメタデータは、適当なフラグメントをプロセッサに素早く指示することができる。
上の例示的なシリアライゼーションに示された本発明のもう1つの長所は、オブジェクトのシリアライゼーションを、1パスで達成できることである。シリアライザプロセスは、基本型からサブタイプおよび含むタイプへ、さらにネストされたタイプへと、トップダウンの形で進行することができる。ネスティングの各レベルで、シリアライザプロセスは、1つまたは複数のフラグメントを作ることができる。そのようなシリアライザは、前に生成されたフラグメントを更新する必要が絶対にないが、望まれる場合にはそうするように構成することができる。
固定長、可変長、およびビットタイプのプリミティブメンバ;他のオブジェクト内にネストされたオブジェクト;継承;インラインLOBおよびアウトオブラインLOB(ファイルストリームを含む);順序付けられたコレクション(ロケータ機能を介して適当な順序でのコレクション要素のシリアライゼーションを提供する);順序付けられないコレクション;およびヌル値をサポートするように、本明細書に示されたシリアライゼーションフォーマットを構成できることを承認されたい。このシリアライゼーションフォーマットは、コンポーズ可能なシリアライゼーションもサポートすることができる。これに関して、ネストされたオブジェクトを、オブジェクトがシリアライズされたフラグメントコンテナのトレースなしですなわち、そのコンテナに対応する状態なしで、既存のシリアライゼーションから抽出することができる。本発明の実施形態のこのプロパティは、ネストされたオブジェクト全体の挿入または更新を可能にする。
また、上のシリアライゼーションの例から、提案されるシリアライゼーションフォーマットが、他の既存データの更新なしでのクラスへのメンバの追加をサポートすることに留意されたい。クラスへのフィールドの追加は、XMLスキーマの使用で非常に一般的であり、この場合に、スキーマは、しばしば、フィールドを追加することによって更新される。これに関して、新しいメンバが、NULLのデフォルト値を有し、既存の型の終りに追加される限り、すべてのタイプのフラグメントを変更して、新しいメンバ(プリミティブオブジェクト、コレクションオブジェクト、またはネストされたオブジェクト)を追加することができる。オブジェクトへの大きいメンバの追加は、レコードフォーマットシリアライゼーションのように心配する必要がない。というのは、提案されるフラグメントベースフォーマットでストアされるオブジェクトを、データベースの単一の列に「バイトのバッグ」としてストアすることができ、任意の大きさにすることができるからである。
上の例のシリアライゼーションで実施されるシリアライゼーションフォーマットのもう1つの利点は、フラグメントの識別を、フラグメントと共にストアする必要がないことである。その代わりに、フラグメントへのパスを使用して、フラグメントの識別を示すことができる。パスは、操作される所与のオブジェクトの型メタデータから判定することができる。パスは、シリアライゼーション内の特定のフラグメントを識別する。パスは、例えば、各ネスティングレベルおよび各サブタイプレベルでフラグメントを識別する、各フラグメントにある数のセットとすることができる。オブジェクトのフィールドが、事前に決定されたフラグメント内にあるので、これらを、パスを使用して突き止めることができる。ある意味で、パスは、フラグメントのアドレスのようなものである。パスは、フラグメントと一緒にストアすることができ、あるいは、最初にシリアライズされたフラグメントからナビゲートすることによって計算することができる。型の埋め込みおよびネスティングをサポートするために、パスは、ネスティングレベルおよびサブタイプレベルを考慮に入れたものとすることができる。
フラグメントベースのシリアライゼーションフォーマットは、オブジェクトをインスタンス化しない、メンバへのアクセスのサポートも可能にする。上で説明したように、パスをフラグメント識別子として使用することによって、メンバ突き止めプロセスまたはナビゲータが、任意の所望のフラグメントにナビゲートすることができる。フラグメントに位置決めされたならば、そのようなプロセスは、そのフラグメント自体へ、または突き止められたフラグメントをルートとするフラグメントのシーケンス全体へのアクセスを可能にすることができる。各フラグメントへのマップの形でシリアライゼーションへのディレクトリを提供することによって、フラグメントの突き止めを、さらに高速に達成することができる。そのようなディレクトリは、Bツリーとして編成されたテーブルにフラグメントをストアすることができる。そのような実施形態で、行ごとに1つのフラグメントをストアすることができ、各行のキーの一部としてフラグメントへのパスを使用できるようになる。
ナビゲータは、特定の動作に関して重要でないフラグメントを効率的にスキップすることもできる。本発明に従ってシリアライズされたフラグメントのナビゲーションに、オープンされたネスティングレベルの個数またはサブタイプ番号のいずれかの追跡を含めることができる。ナビゲータが、所望のネスティングレベルまたはサブタイプに達したならば、そのナビゲータは、そのレベルまたはサブタイプでフラグメントの個数をカウントすることができる。そのようなフラグメント自体が、ネスティングの新しいレベルを開始することができる。
さらに、フラグメントベースのフォーマットでシリアライズされたオブジェクトのメンバを突き止めることの利点を引き立たせて、プリミティブメンバへのアクセスに、次の単純な動作を含めることができる。まず、ナビゲータが、バイナリフラグメントを突き止めることができる。上で説明したように、プリミティブメンバは、有利なことに、そのようなフラグメントにストアされる。次に、要求されたメンバを、標準的な最適化されたレコードクラッキングコードを使用して抽出することができる。そのメンバを、標準的な最適化されたレコード作成コードを使用して更新することもできる。この単純な動作は、単一のデータベース列に便利にストアできるシリアライズされたオブジェクトのプリミティブメンバの高性能の突き止めを提供する。この形でメンバ突き止めを可能にすることの利点は、上で述べたように、ホストオブジェクト全体をインスタンス化する必要なしにメンバを更新できることである。これによって、オブジェクト全体をインスタンス化せずに、フラグメントまたはフラグメントのシーケンスを置換できるようになる。各フラグメントは、自己完結型とすることができ、フラグメントシーケンスの識別子が、ネスティングを開始するフラグメントおよびターミネータフラグメントの存在になるように、本発明を構成することができる。これによって、他の場所で長さをフィックスアップせずに更新を実行することが可能になり、標準的なレコードフォーマットシリアライゼーションのオフセットテーブルが回避される。
本明細書に示された技法に従って生成されるフラグメントのストリームのストレージは、LOBとしてフラグメントのストリームをストアすることによって行うことができる。そのようなLOBは、そのキーがオフセット位置である、ツリー構造のストレージフォーマットを有することができる。フラグメントのストリームをストアするこの技法は、LOBのサイズに依存する、予測可能な挿入時間および削除時間を提供する。この技法は、LOBの一部だけの更新も可能にする。フラグメントにシリアライズされたオブジェクトのオンワイヤフォーマットは、フラグメントヘッダの形状に関してオンディスクフォーマットと同一である。LOBフラグメントおよびFSフラグメント以外のフラグメントの場合に、オンワイヤであるフラグメントとオンディスクであるフラグメントについて、変更はまったく不要である。本発明のこの態様によって、オブジェクトをワイヤに素早くコピーすることが可能になり、ある位置から別の位置にオブジェクトを転送する速度の大幅な向上がもたらされる。しかし、追加の柔軟性を提供するために、LOBフラグメントおよびFSフラグメントについて、フラグメント内容を変更できることに留意されたい。本発明のこの態様は、潜在的なフラグメントタイプの要約に関して上で説明した。
フラグメントシリアライズされたオブジェクトに対する動作
所与のフォーマットでシリアライズされたオブジェクトに対する動作実行の単純さ、効率、および柔軟性は、シリアライゼーションフォーマットの性能を評価する際の効果的な判断基準である。本明細書で説明する本発明の実施形態は、これに関する大きい利益の特徴がある。これは、このセクションで提供する技法を使用して動作が実行される時に、特にそうである可能性がある。しかし、次の動作のリストは、本発明の技法に従ってシリアライズされたオブジェクトに対する可能な動作の網羅的リストと考えてはならず、そのような動作を実行する網羅的な形での動作技法の説明でもないことに留意されたい。次の動作は、参照を簡単にするために番号を付けられているが、これは、動作の実行の順序またはシーケンスを示すものではない。そうではなく、これらの動作のそれぞれを、独立にまたは他の動作と共に実行することができる。
所与のフォーマットでシリアライズされたオブジェクトに対する動作実行の単純さ、効率、および柔軟性は、シリアライゼーションフォーマットの性能を評価する際の効果的な判断基準である。本明細書で説明する本発明の実施形態は、これに関する大きい利益の特徴がある。これは、このセクションで提供する技法を使用して動作が実行される時に、特にそうである可能性がある。しかし、次の動作のリストは、本発明の技法に従ってシリアライズされたオブジェクトに対する可能な動作の網羅的リストと考えてはならず、そのような動作を実行する網羅的な形での動作技法の説明でもないことに留意されたい。次の動作は、参照を簡単にするために番号を付けられているが、これは、動作の実行の順序またはシーケンスを示すものではない。そうではなく、これらの動作のそれぞれを、独立にまたは他の動作と共に実行することができる。
本発明の利点の1つが、図9のように、データベースのテーブルの単一の列にオブジェクトをストアすることができると同時に、オブジェクト内のメンバに関する高性能の検索機能および更新機能を可能にすることである。これに関して、図9に、データベースの単一の列にあるオブジェクトの類別を示す。本明細書に記載の本発明の様々な実施形態によれば、オブジェクトは、レコードフォーマットのプリミティブデータを含む第1フラグメント(これは、副分割されたペイロードの灰色のフラグメントである)と、この説明で示すフラグメントのいずれかとすることができる後続フラグメントを用いてシリアライズされる。シリアライズされたオブジェクトに対する動作の次の説明では、本発明の実施形態がデータベースの列にストアされるシナリオについて、図9を参照されたい。
次の例示的な動作を、一般的なユーザ定義型(「UDT」)オブジェクトと、そのようなオブジェクトをシリアライズするように設計された本発明の特定の実施形態に関して説明する。フラグメントストリームとしてストアされたUDTオブジェクトに対して実行できる動作の基本的なアルゴリズムを提供する。
動作1:オブジェクトを、そのパスを使用して一意に識別する。UDTが、フラグメントのシーケンスとしてストアされている時に、シーケンス内の各フラグメントを、「パス」によって一意に識別することができる。パスは、ステップのシーケンスであり、各ステップは、正確に次のうちの1つとすることができる。
1.非プリミティブフィールドを示すフラグメントIDを指定する、ネスティングステップ:UDTの各非プリミティブフィールドに、一意のフラグメントIDを割り当てる。フラグメントIDは、1から始まる。これには、次が含まれる。
・ ラージオブジェクト(LOB)(無制限の長さまたは非常に大きい長さを有する文字/バイナリデータなど)である、その中のフィールド。これらのフィールドのそれぞれは、別々のフラグメントとしてストアされる。
・ ファイルストリームすなわちファイルへのポインタである、その中のフィールド。このファイルに、実際のデータが含まれ、このファイルは、データベースの外にある。これらのフィールドのそれぞれが、別々のフラグメントとしてストアされる。
・ 別のUDT(別のUDT内でのUTDのネスティングを、UDTのコンポジションとも称する)または別のUDTのコレクションとすることができる、その中のフィールド。例えば、UDT Aが、型UDT Bのフィールドbを有することができる。この場合に、bを、単一の自己終端フラグメントとしてストアすることができ、あるいは、Bが非プリミティブフィールドであるか別のUDTのサブタイプである場合に、フラグメントのシーケンスとしてストアすることができる。
フラグメントIDを割り当てる時に、スーパータイプから継承した非プリミティブフィールドを考慮する必要がないことに留意されたい。したがって、UDT QがUDT Pのサブタイプである場合に、UDT Qの非プリミティブフィールドにフラグメントIDを割り当てる時に、QがPのすべてのフィールドを継承してはいるが、Pのフィールドは考慮しない。
また、UDTの非プリミティブフィールドが、そのフラグメントIDの昇順でレイアウトされることに留意されたい。
2.深さを指定する継承ステップ:これは、フラグメントがどのサブタイプセクションに置かれるかを告げる。基本型のプリミティブフィールドおよび非プリミティブフィールドが、そのサブタイプの前にレイアウトされることを想起されたい。UDT Rが、UDT Qのサブタイプであり、UDT Qが、UDT Pのサブタイプであると仮定する。型Rのオブジェクトのレイアウトは、次のようになる。
2の深さを指定する継承ステップは、Qのセクションを示し、3の深さを示す継承ステップは、Rのセクションを示す。Pのセクションを示すために、継承ステップは必要でない。
3.ロケータを指定するコレクションメンバステップ:(ロケータは、コレクションのメンバを一意に識別する。コレクションのメンバは、1から始まるロケータを割り当てられる。コレクションメンバが削除される時に、ロケータに「ギャップ」が生じ、挿入される後続のメンバが、そのロケータを再利用する。したがって、メンバが削除されていない場合に、N個のメンバを有するコレクションのメンバは、ロケータ1からNを有する)。UDT AがUDT Cのコレクションである場合に、2つのメンバを含む型Aのオブジェクトが、次のようになることを想起されたい。
メンバ1のロケータを指定するコレクションメンバステップは、メンバ1のセクションを示し、メンバ2のロケータを指定するコレクションメンバステップは、メンバ2のセクションを示す。
複合UDT内のフラグメントは、ネスティングステップ、ロケータステップ、および継承ステップの適当な順列を用いて一意に突き止めることができる。
S1、S1、S2、...、Snの順番のn個のステップからなるパスを、S1.S2...Snと表す。また、Pがパスである場合に、Pのステップ数に表記size(P)、Pのi番目のステップに表記P[i]を使用し、i>0である。
動作2。バイトストリーム上でのフラグメントストリームの実施。データベースは、長年にわたって、制限付きの長さおよび無制限の長さの文字/バイナリデータをサポートしてきた。文字/バイナリデータの上でバイトストリームインターフェースを提供することは、既知の技術である。バイトストリームインターフェースに、次のような方法が含まれる。
1.ある指定されたオフセット「s」から始めて「n」バイトを読み取る。
2.ある指定されたオフセット「s」から始めて「n」バイトを挿入する。概念上、オフセット「s」から始まる既存データが、「n」バイトだけシフトされ、作成された「ギャップ」が、供給される「n」バイトで満たされる。しかし、バイトストリームが大きい時に、実装は、膨大な量のデータを実際にシフトしないのに十分にスマートである。実装は、バイトストリームの上で作られるインデックス構造を使用してこれを達成する。
3.読み取られるデータが、バイトストリームインターフェースをサポートするオブジェクトの形で要求される、1の変形形態。
4.挿入される新しいデータが、バイトストリームインターフェースをサポートする別のオブジェクトの形で提供される、2の変形形態。
5.指定されたオフセット「s」から始まる「n」バイトを、供給されるデータに置換する。供給されるデータを「空」にすることができ、その場合に、その効果が、オフセット「s」から始まる「n」バイトを除去することであることに留意されたい。
6.新しいデータが、バイトストリームインターフェースをサポートするオブジェクトの形で提供される、5の変形形態。
上のリストが、網羅的であるのではなく代表的であることを意図されていることに留意されたい。前に述べたように、UDTは、フラグメントストリームとしてストアされる。フラグメントストリームは、バイトストリームの上で実施することができる。
動作3:パス情報からのフラグメントの突き止め。UDTを表すフラグメントストリームを検討されたい。このセクションでは、その所与のパス内でフラグメントをどのように突き止めるかを説明する。
パスが有効である場合に、途中でヌルUDTに出会う時を除いて、パスに対応するフラグメントが見つからなければならず、ヌルUDTに出会った場合には、さらにトラバースすることができず、フラグメントが見つからなかったと考えることができる。例えば、「department」UDT内で「manager」フィールドを探す時に、「department」オブジェクト自体のフラグメントがヌルフラグメントである場合に、この方法は、「manager」のフラグメントが見つからなかったことを示すためにFALSEを返す。
スキーマエボリューションが、パスが有効である場合であってもパスに対応するフラグメントがない可能性があるもう1つの状況を導入することに留意されたい。次は、LocateFragmentの基本的なアルゴリズムである。当初に、FragmentStreamオブジェクトのcurrentPathが、空のパスであり、現在のフラグメントが、最初のフラグメントである。
FragmentStream::AdvanceTillStep()。フラグメントをさらに突き止めるために、「advance till step(ステップまで前進)」動作も使用することができる。このメソッドでは、次のルールに従って2つのステップを比較する。第1に、「ネスティングステップ」が別の「ネスティングステップ」より小さいのは、前者のフラグメントIDが後者のフラグメントIDより小さい場合である。第2に、「継承ステップ」が別の「継承ステップ」より小さいのは、前者の深さが後者の深さより小さい場合である。第3に、「ロケータステップ」が別の「ロケータステップ」より小さいのは、前者のロケータが後者のロケータより小さい場合である。第4に、「ネスティングステップ」は、必ず「継承ステップ」より小さい(サブタイプからのフィールドの前にすべてのネストされたフィールドをストアするので)。最後に、「ロケータステップ」は、「ネスティングステップ」または「継承ステップ」と比較できず、そのような比較を試みることは、エラーである。例えば、次のアルゴリズムを参照されたい。
FragmentStream::GetNextFragment()。さらに、次のフラグメントを得る動作を、次のように実装することができる。
動作4:プリミティブフィールドの選択。プリミティブフィールドの選択には、まずパスを使用してプリミティブフィールドを含むフラグメントを突き止めることが含まれる。このフラグメントのペイロードは、レコードフォーマットであり、プリミティブフィールドを有する。次に、標準的な最適化されたレコード操作コードを使用して、ペイロードからプリミティブフィールドを抽出することができる。
動作5:プリミティブフィールドの更新。プリミティブフィールドの更新は、3つのステップで達成することができる。まず、プリミティブフィールドを選択するのと同一の形で、プリミティブフィールドを含むフラグメントを、そのパスを使用して突き止める。次に、フラグメントのペイロードのコピーを作り、標準的な最適化されたレコード操作コードを使用して、更新が必要なプリミティブフィールドの古い値を新しい値に置換する。これによって、新しいペイロードが与えられ、これは、オリジナルのペイロードより長いまたはより短いものとすることができる。第3に、古いペイロードを新しいペイロードに置換することによって、フラグメントを更新する。これによって、フラグメントの長さが増えるか減る場合があり、その長さを、それ相応に調整しなければならないことに留意されたい。
動作6:埋め込まれたUDT全体のコピー。埋め込まれたUDT全体のコピーには、まず、上で示したlocateFragment()を使用して、埋め込まれたUDTのパスから埋め込まれたUDTの先頭をマークするフラグメントを見つけることが含まれる。第2に、下で説明するCopyOutFragmentSequence()関数を使用して、埋め込まれたUDTに属するフラグメントをコピーすることができる。
さらに、UDTをコピーするために、次の基本的なアルゴリズムを使用して、FragmentStream::CopyOutFragmentSequence()関数を使用することができる。
さらに、ナビゲーション継続関数「FragmentStream::CanContinueNavigation()」は、次の基本的なアルゴリズムに従うものとすることができる。
動作7:埋め込まれたUDTのすべてのフラグメントの除去。CopyOutFragmentSequence()に似たメソッドDeleteFragmentSequence()が、埋め込まれたUDTに属するすべてのフラグメントを除去するために設けられている。フラグメントごとに、基礎になるByteStreamクラスを使用して、そのフラグメントのバイトを除去することができる。フラグメントがファイルストリームフラグメントである場合には、基礎になるファイルを実際に削除するために、特殊な処理が必要である。
動作8:新しいUDTによる埋め込まれたUDTの更新。本発明人が「FragmentStream::ReplaceFragmentSequence()」と呼ぶアルゴリズムは、まず、埋め込まれたUDTを、そのパスを使用して突き止め、次に、DeleteFragmentSequence()を使用して、埋め込まれたUDTに属するすべてのフラグメントを削除し、最後に、新しいUDTのフラグメントを読み取り、現在位置に挿入することができる。やはり、基礎になるByteStreamクラスを使用して、新しいフラグメントのバイトを置くことができる。ファイルストリームフラグメントを挿入するためには、適当なデータを用いてファイルを作成する必要があり、そのファイルへのポインタをフラグメントに置く必要があるので、特殊な処理が必要である。
動作9:コレクションメンバの挿入。オブジェクトBを表すFragmentStreamオブジェクト内のコレクションのメンバとして、FragmentStreamオブジェクトの形で提供されるUDTオブジェクトAを挿入することを検討されたい。次のアルゴリズムを、本発明人はFragmentStream::InsertCollectionElement()と呼び、これは、まず、コレクションへのパスを使用して、B内のコレクションを突き止める。次に、ロケータおよび挿入の位置を見つける。前に述べたように、コレクションメンバが以前に削除された場合に、これによって、ロケータ内の「ギャップ」がもたらされる。そのようなギャップが存在する場合に、未使用ロケータが、新しいメンバに割り当てられ、新しいメンバは、すべてのメンバがロケータの昇順でレイアウトされるように挿入される。そうでない場合には、新しいメンバは、最後のメンバより1つ大きいロケータが割り当てられ、最後のメンバの後に挿入される。Aの最初のフラグメントを、ロケータを置くために変更しなければならないことに留意されたい。
動作10:コレクションメンバの削除。本発明人が「FragmentStream::DeleteCollectionElement()」と呼ぶアルゴリズムは、メンバのロケータを使用して、削除されるメンバを指定することができる。削除には、まず、パスを使用してコレクションを突き止めることと、次に、コレクション内で削除されるメンバを突き止めることが含まれる。ここで、ロケータステップを扱っているだけなので、パスを与えられてフラグメントを突き止めるというより単純な問題であることに留意されたい。したがって、LocateFragmentメソッドに類似するロジックを、これに使用することができる。次に、削除されるメンバに属する最初のフラグメントに位置したならば、DeleteFragmentSequenceを呼び出す。
動作11:コレクション全体または単一のコレクションメンバの更新。異なるコレクションによるコレクション全体の置換は、別のUDTによる埋め込まれたUDTの置換と同一の形で行われる。同様に、コレクションメンバを突き止めたならば、そのメンバの更新は、埋め込まれたUDTの更新と同一の形で行うことができる。
動作12:UDTの複数のフィールドの選択または更新。複数のフィールドを選択または更新する時に、次の最適化が実行される。まず、選択/更新を順序付ける。2つのステップの比較および順序付けは、上で説明した。パスを、ステップのストリングと考えることができ、「辞書編集」順序付けを、パスに対して定義することができる。次のアルゴリズムを参照されたい。
フィールドは、それを含むフラグメントへのパスの昇順で選択または更新される。この順序付けが、フラグメントがフラグメントストリームに現れるのと同一の順序であることに留意されたい。複数のプリミティブフィールドが、同一のフラグメント内で突き止められる可能性がある。その場合に、それらを含むフラグメントを訪問したならば、標準的なレコード操作コードを使用して、そのフラグメントをもう一度訪れる必要なしに、すべての所望のフィールドを効率的に選択または更新する。これを行うことによって、複雑なUDT内であっても、そのUDTのすべての所望のフィールドを選択または更新するために、そのフラグメントストリーム上で多くとも1つのパスが必要である。
動作13:現在位置を使用するためのLocateFragmentの機能強化:LocateFragmentアルゴリズムの前の説明は、必ずフラグメントストリームに先頭で開始された。しかし、選択または更新が必要な最初のフィールドを含むフラグメントを突き止める場合に限って、LocateFragmentを先頭から開始する必要がある。選択または更新が必要な後続フィールドを含むフラグメントを突き止めるために、locateFragmentは、現在位置から開始することができる。LocateFragmentに必要な機能強化を、下で短く述べる。2つの基本的な事例がある。
1.currentPath==prefix(targetPath)すなわちcurrentPathのすべてのステップが、targetPathのステップと一致するが、ターゲットパスが、追加のステップを有する。この場合に、locateFragmentは、i=0の反復から開始するのではなく、I=size(currentPath)+1の反復から開始することができる。
2.あるk<sizeof(currentPath)に関して、currentPathの最初のk個のステップが、targetPathと一致するが、k+1番目のステップが一致しない。この場合に、パスが既に昇順でソートされているので、currentPath[k+1]<targetPath[k+1]でなければならないことに留意されたい。この場合にも、locateFragmentは、i=k+1の反復のAdvanceTillStepから開始することができる。
動作14:レイジイマテリアライゼーション(lazy materialization)。UDTのシリアライゼーションをサーバからクライアントに送る時に、LOBデータおよびファイルストリームフィールドからのファイルデータを送ることが、最も時間のかかる要因になる傾向がある。したがって、フラグメントストリームマネージャは、「レイジイマテリアライゼーション」オプションを提供することができる。
UDTのシリアライゼーションが、レイジイマテリアライゼーションオプション付きで要求される時に、「クッキー」が、LOB/ファイルストリームデータの代わりに返される。呼出し側は、その後、LOB/ファイルストリームフラグメントのパスおよび「クッキー」を渡すことによって、完全なLOB/ファイルストリームデータを要求することができる。パスおよびクッキーは、フラグメントストリームマネージャがLOB/ファイルストリームデータを取り出すのに十分な情報を与える。
動作15:スキーマエボリューション(schema evolution)。スキーマエボリューションは、UDTのフィールドの追加、除去、または変更(フィールドのデータ型の変更など)によるUDTの変更または新しいUDTなどを定義することによる継承階層の変更を指す。そのような変更は、既に永続しているUDTのインスタンスに影響する可能性がある。単純な解決策は、既存フィールドに割り当てられたフィールドIDおよびフラグメントIDのすべてが、新しいフィールドが追加された時に同一のままになるようにすることである。その後、すべての事前に存在する永続したUDTのインスタンスを変更せずに、UDTへの新しいフィールドの追加をサポートすることができる。
最後に、本明細書で説明した様々な技法を、ハードウェアまたはソフトウェアに関して、あるいは適当な場合にこの両方の組み合わせに関して実施できることを理解されたい。したがって、本発明の方法および装置、またはそのある態様または部分が、フロッピディスク、CD−ROM、ハードドライブ、または他の機械可読記憶媒体などの有形の媒体で実施されるプログラムコード(すなわち命令)の形をとることができ、このプログラムコードが、コンピュータなどの機械にロードされ、これによって実行される時に、その機械が、本発明を実践するための装置になる。プログラマブルコンピュータでのプログラムコード実行の場合に、コンピューティングデバイスに、一般に、プロセッサ、プロセッサによって可読の記憶媒体(揮発性および不揮発性のメモリおよび/または記憶要素を含む)、少なくとも1つの入力デバイス、および少なくとも1つの出力デバイスが含まれる。例えばデータ処理API、再利用可能なコントロール、または類似物の使用を介するなど、本発明のユーザインターフェース技法を実施または使用することができる1つまたは複数のプログラムは、コンピュータシステムと通信するために、高水準手続き指向プログラミング言語または高水準オブジェクト指向プログラミング言語で実施されることが好ましい。しかし、望まれる場合に、プログラムをアセンブリ言語または機械語で実施することができる。どの場合でも、言語は、コンパイルされる言語または解釈される言語とすることができ、ハードウェア実施形態と組み合わせることができる。
例示的な実施形態で、1つまたは複数の独立型コンピュータシステムの文脈で本発明を使用することに言及したが、本発明は、それに制限されるのではなく、ネットワーク環境または分散コンピューティング環境などの任意のコンピューティング環境に関して実施することができる。さらに、本発明を、複数の処理チップまたは処理デバイス内あるいはこれらにまたがって実施することができ、ストレージを、同様に、複数のデバイスにまたがってもたらすことができる。そのようなデバイスに、パーソナルコンピュータ、ネットワークサーバ、ハンドヘルドデバイス、スーパーコンピュータ、または自動車もしくは航空機などの他のシステムに統合されたコンピュータを含めることができる。したがって、本発明は、単一の実施形態に制限されるのではなく、付属の特許請求の範囲による広がりおよび範囲で解釈されなければならない。
付録A:フラグメント検証プロセス
次のアルゴリズムは、フラグメントを検証するのに使用できるトップレベルコンピュータプロセスコマンドを表す。
次のアルゴリズムは、フラグメントを検証するのに使用できるトップレベルコンピュータプロセスコマンドを表す。
フラグメント検証コードの代替レイアウトを、下に示すが、ここでは、シリアライゼーションの文法が、バッカスナウア表記(「BNF」)で示されている。
引用符“”の中のシンボルは、ターミナルである。例えば、“self−terminating bin frag”は、ターミナルを表す。様々なターミナルシンボルは、前のセクションで定義されている。
かぎ括弧<>の中のシンボルは、非ターミナルである。例えば、<containment frag>は、非ターミナルである。
大括弧{}の中のシンボルは、そのシンボルが0回以上繰り返される可能性があることを示す。例えば、{<containment frag>}は、<containment frag>の0個以上のインスタンスがある可能性があることを示す。
注釈フラグメントは、ストリーム内のどこにでも存在することができる。
Claims (37)
- 複数のシーケンシャルにストアされたバイトと、
前記複数のシーケンシャルにストアされたバイト内で表される少なくとも1つのデータメンバであって、データ型に関連する、少なくとも1つのデータメンバと、
前記少なくとも1つのデータメンバの前記データ型を識別するのに使用される、前記複数のシーケンシャルにストアされたバイト内の少なくとも1つのタイプバイトであって、前記少なくとも1つのデータメンバに実質的に隣接して配置される、少なくとも1つのタイプバイトと
を含むことを特徴とする、データオブジェクトとして一緒にストアされる1つまたは複数のデータメンバ。 - 前記少なくとも1つのデータメンバは、レコードフォーマットでストアされ、前記レコードフォーマットは、前記少なくとも1つのタイプバイトに関する前記少なくとも1つのデータメンバの予測可能な位置を定義することを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 前記少なくとも1つのデータメンバの長さを識別するのに使用される、前記シーケンシャルにストアされた複数のバイトの少なくとも1つの長さバイトをさらに含むことを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 前記少なくとも1つのデータメンバは、前記データオブジェクトに関連するデータの位置を示し、前記位置は、位置タイプに関連し、前記複数のシーケンシャルにストアされたバイトの少なくとも1つの位置バイトは、前記位置タイプを識別するのに使用されることを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 前記少なくとも1つのタイプバイトは、前記複数のシーケンシャルにストアされたバイトの第1バイトであり、前記データオブジェクトの始めを示すことを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 前記少なくとも1つのタイプバイトは、データオブジェクトの型を示すことを特徴とする請求項5に記載の1つまたは複数のデータメンバ。
- 前記データ型は、ラージオブジェクト(「LOB」)を除外したプリミティブデータ型、ラージオブジェクト(「LOB」)データ型、ファイルストリーム(「FS」)データ型、およびコレクション要素データ型を含む群から選択されることを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 前記少なくとも1つのデータメンバは、LOBを除外したプリミティブデータ型に関連する場合に、前記少なくとも1つのデータメンバは、レコードフォーマットでストアされ、前記レコードフォーマットは、前記少なくとも1つのタイプバイトに関する前記少なくとも1つのデータメンバの予測可能な位置を定義することを特徴とする請求項7に記載の1つまたは複数のデータメンバ。
- 前記少なくとも1つのタイプバイトは、前記少なくとも1つのデータメンバが前記データオブジェクトの唯一の1つまたは複数のメンバであることを示すことを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 前記複数のシーケンシャルにストアされたバイト内の少なくとも1つのコレクション開始バイトをさらに含み、前記少なくとも1つのコレクション開始バイトは、前記少なくとも1つのコレクション開始バイトに実質的に隣接してストアされた関連する一連のデータメンバの先頭を示すのに使用されることを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 前記複数のシーケンシャルにストアされたバイト内の少なくとも1つのターミネータバイトをさらに含み、前記少なくとも1つのターミネータバイトは、シリーズデータメンバの終りを示すのに使用されることを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- データメンバのコレクションの一部である第1データメンバに関連する、前記複数のシーケンシャルにストアされたバイト内の少なくとも1つのバイトをさらに含み、前記少なくとも1つのバイトは、データメンバの前記コレクションの一部である第2データメンバに関する情報を提供することを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 前記少なくとも1つのデータメンバに実質的に隣接してストアされた少なくとも1つのバイナリツリー(「bツリー」)番号をさらに含むことを特徴とする請求項1に記載の1つまたは複数のデータメンバ。
- 少なくとも1つのデータメンバからなるデータオブジェクトをストアするか伝送する方法であって、
複数のシーケンシャルにストアされたバイト内で少なくとも1つのデータメンバを表すことであって、前記少なくとも1つのデータメンバは、データ型に関連することと、
前記複数のシーケンシャルにストアされたバイト内の少なくとも1つのバイトを、前記少なくとも1つのデータメンバの型情報を識別すること専用にすることであって、前記少なくとも1つのバイトは、前記少なくとも1つのデータメンバに実質的に隣接して配置されることと
を含むことを特徴とする方法。 - 前記少なくとも1つのデータメンバを表すことは、レコードフォーマットで行われ、前記レコードフォーマットは、前記少なくとも1つのタイプバイトに関する前記少なくとも1つのデータメンバの予測可能な位置を定義することを特徴とする請求項14に記載の方法。
- 前記複数のシーケンシャルにストアされたバイトの少なくとも1つのバイトを、前記少なくとも1つのデータメンバの長さを識別すること専用にすることをさらに含むことを特徴とする請求項14に記載の方法。
- 前記少なくとも1つのデータメンバは、前記データオブジェクトに関連するデータの位置を示し、前記位置は、位置タイプに関連し、前記複数のシーケンシャルにストアされたバイトの少なくとも1つの位置バイトは、前記位置タイプを識別するのに使用されることを特徴とする請求項14に記載の方法。
- 前記少なくとも1つのバイトは、前記複数のシーケンシャルにストアされたバイトの第1バイトであり、前記データオブジェクトの始めを示すことを特徴とする請求項14に記載の方法。
- 前記少なくとも1つのタイプバイトは、データオブジェクトの型を示すことを特徴とする請求項14に記載の方法。
- 前記データ型は、ラージオブジェクト(「LOB」)を除外したプリミティブデータ型、ラージオブジェクト(「LOB」)データ型、ファイルストリーム(「FS」)データ型、およびコレクション要素データ型を含む群から選択されることを特徴とする請求項14に記載の方法。
- 前記少なくとも1つのデータメンバは、LOBを除外したプリミティブデータ型に関連する場合に、前記少なくとも1つのデータメンバは、レコードフォーマットでストアされ、前記レコードフォーマットは、前記少なくとも1つのタイプバイトに関する前記少なくとも1つのデータメンバの予測可能な位置を定義することを特徴とする請求項20に記載の方法。
- 前記少なくとも1つのタイプバイトは、前記少なくとも1つのデータメンバが前記データオブジェクトの唯一の1つまたは複数のメンバであることを示すことを特徴とする請求項14に記載の方法。
- 前記複数のシーケンシャルにストアされたバイト内の少なくとも1つのバイトを、前記少なくとも1つのコレクション開始バイトに実質的に隣接してストアされる一連の関連するデータメンバの始めをマークすること専用にすることをさらに含むことを特徴とする請求項14に記載の方法。
- 前記複数のシーケンシャルにストアされたバイト内の少なくとも1つのターミネータバイトをさらに含み、前記少なくとも1つのターミネータバイトは、シリーズデータメンバの終りを示すのに使用されることを特徴とする請求項14に記載の方法。
- 前記複数のシーケンシャルにストアされたバイト内の少なくとも1つのバイトを、データメンバの前記コレクションの一部である第2データメンバに関する情報を提供すること専用にすることをさらに含み、前記少なくとも1つのバイトは、データメンバのコレクションの一部である第1データメンバに関連することを特徴とする請求項14に記載の方法。
- 請求項14に記載の方法を実行する命令を含むことを特徴とするコンピュータ可読媒体。
- 請求項14に記載の方法を実行する命令を含むことを特徴とする変調されたデータ信号。
- 1つまたは複数のデータメンバからなるデータオブジェクトをストアまたは伝送する方法であって、
複数のシーケンシャルに置かれたバイトを少なくとも1つのヘッダセクションおよび少なくとも1つのペイロードセクションに分割することであって、前記少なくとも1つのヘッダセクションおよび前記少なくとも1つのペイロードセクションは、互いに隣接して置かれることと、
前記ペイロードセクション内で少なくとも1つのデータメンバを表すことであって、前記少なくとも1つのデータメンバは、データ型に関連することと、
前記ヘッダセクション内で前記データ型を表すことと、
前記少なくとも1つのデータメンバをレコードフォーマットで前記ペイロードセクションに置くことであって、前記レコードフォーマットは、前記ペイロードセクション内の他のメンバに関する前記少なくとも1つのデータメンバの予測可能な位置を定義することと
を含むことを特徴とする方法。 - 前記少なくとも1つのデータメンバは、プリミティブデータ型に関連することを特徴とする請求項28に記載の方法。
- 前記ヘッダセクション内でペイロード長さを表すことをさらに含むことを特徴とする請求項28に記載の方法。
- 前記複数のシーケンシャルに置かれたバイトを、さらに、少なくとも1つの第2ヘッダセクションおよび少なくとも1つの第2ペイロードセクションに分割することであって、前記少なくとも1つの第2ヘッダセクションおよび前記少なくとも1つの第2ペイロードセクションは、互いに隣接して置かれることと、
前記少なくとも1つの第2ペイロードセクション内で少なくとも1つの第2データメンバの位置情報を表すことであって、前記位置情報は、位置タイプの位置を指定することと、
前記第2ヘッダセクション内で前記位置タイプを識別することと
をさらに含むことを特徴とする請求項28に記載の方法。 - 前記少なくとも1つの第2ペイロードセクション内にLOBタイプデータメンバを置くことをさらに含むことを特徴とする請求項31に記載の方法。
- 前記少なくとも1つの第2ペイロードセクション内にFSタイプデータメンバを置くことをさらに含むことを特徴とする請求項31に記載の方法。
- 前記少なくとも1つの第2ヘッダセクション内でペイロード長さを表すことをさらに含むことを特徴とする請求項31に記載の方法。
- 前記複数のシーケンシャルに置かれたバイトを、少なくとも1つの第2ヘッダセクションにさらに分割することと、
前記少なくとも1つの第2ヘッダセクションを用いて、前記少なくとも1つの第2ヘッダセクションに実質的に隣接して置かれる関連するデータメンバのコレクションの始めをマークすることと
をさらに含むことを特徴とする請求項28に記載の方法。 - 前記少なくとも1つの第2ヘッダセクション内で、関連するデータメンバの前記コレクションが順序付けられるか順序付けられないかを示すことをさらに含むことを特徴とする請求項35に記載の方法。
- 前記複数のシーケンシャルに置かれたバイトを、少なくとも1つの第2ヘッダセクションにさらに分割することと、
前記少なくとも1つの第2ヘッダセクションを用いて前記データオブジェクトの終りをマークすることと
をさらに含むことを特徴とする請求項28に記載の方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US10/821,687 US20050234986A1 (en) | 2004-04-09 | 2004-04-09 | Systems and methods for fragment-based serialization |
PCT/US2004/024539 WO2005103937A1 (en) | 2004-04-09 | 2004-07-29 | Systems and methods for fragment-based serialization |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2007532998A true JP2007532998A (ja) | 2007-11-15 |
Family
ID=35097508
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007507295A Pending JP2007532998A (ja) | 2004-04-09 | 2004-07-29 | フラグメントベースのシリアライゼーションのシステムおよび方法 |
Country Status (6)
Country | Link |
---|---|
US (2) | US20050234986A1 (ja) |
EP (1) | EP1618487A4 (ja) |
JP (1) | JP2007532998A (ja) |
KR (1) | KR20070053083A (ja) |
CN (1) | CN1761956A (ja) |
WO (1) | WO2005103937A1 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006277742A (ja) * | 2005-03-28 | 2006-10-12 | Microsoft Corp | Udtに対するデータフォーマットについてストリーミングチェックを行うシステムおよび方法 |
Families Citing this family (38)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050234986A1 (en) | 2004-04-09 | 2005-10-20 | Microsoft Corporation | Systems and methods for fragment-based serialization |
US20080040498A1 (en) * | 2006-08-10 | 2008-02-14 | Nokia Corporation | System and method of XML based content fragmentation for rich media streaming |
US7801886B1 (en) * | 2006-10-10 | 2010-09-21 | Intuit Inc. | Method and apparatus for performing database operations involving custom fields |
CN101192148B (zh) * | 2006-12-01 | 2012-02-01 | 深圳迈瑞生物医疗电子股份有限公司 | 兼容新旧应用程序的数据处理方法及其数据存储方法 |
US7761411B2 (en) * | 2007-07-20 | 2010-07-20 | Oracle International Corporation | Delta operations on a large object in a database |
US8626720B2 (en) | 2008-02-11 | 2014-01-07 | International Business Machines Corporation | System and method of reconstructing complex custom objects |
US20100332529A1 (en) * | 2009-06-24 | 2010-12-30 | Microsoft Corporation | Mapping Of Metadata Between A Web Service And A Line-Of-Business System |
US8417714B2 (en) * | 2010-01-22 | 2013-04-09 | Oracle International Corporation | Techniques for fast and scalable XML generation and aggregation over binary XML |
US10289636B2 (en) * | 2010-02-08 | 2019-05-14 | Here Global B.V. | Virtual table generator for analyzing geographic databases |
US8856460B2 (en) * | 2010-09-15 | 2014-10-07 | Oracle International Corporation | System and method for zero buffer copying in a middleware environment |
US8954475B2 (en) * | 2011-11-10 | 2015-02-10 | Microsoft Technology Licensing, Llc | Deep cloning of objects using binary format |
CN104077335B (zh) * | 2013-05-07 | 2017-05-03 | 腾讯科技(深圳)有限公司 | 一种结构化数据的序列化、反序列化方法、装置和系统 |
US9560136B2 (en) * | 2014-08-07 | 2017-01-31 | Sap Se | High speed communication protocol |
US10474648B2 (en) | 2014-11-25 | 2019-11-12 | Sap Se | Migration of unified table metadata graph nodes |
US10255309B2 (en) | 2014-11-25 | 2019-04-09 | Sap Se | Versioned insert only hash table for in-memory columnar stores |
US9513811B2 (en) * | 2014-11-25 | 2016-12-06 | Sap Se | Materializing data from an in-memory array to an on-disk page structure |
US10042552B2 (en) | 2014-11-25 | 2018-08-07 | Sap Se | N-bit compressed versioned column data array for in-memory columnar stores |
US10725987B2 (en) | 2014-11-25 | 2020-07-28 | Sap Se | Forced ordering of a dictionary storing row identifier values |
US9891831B2 (en) | 2014-11-25 | 2018-02-13 | Sap Se | Dual data storage using an in-memory array and an on-disk page structure |
US10558495B2 (en) | 2014-11-25 | 2020-02-11 | Sap Se | Variable sized database dictionary block encoding |
US10552402B2 (en) | 2014-11-25 | 2020-02-04 | Amarnadh Sai Eluri | Database lockless index for accessing multi-version concurrency control data |
US9965504B2 (en) | 2014-11-25 | 2018-05-08 | Sap Se | Transient and persistent representation of a unified table metadata graph |
US9779104B2 (en) | 2014-11-25 | 2017-10-03 | Sap Se | Efficient database undo / redo logging |
US9875024B2 (en) | 2014-11-25 | 2018-01-23 | Sap Se | Efficient block-level space allocation for multi-version concurrency control data |
US9824134B2 (en) | 2014-11-25 | 2017-11-21 | Sap Se | Database system with transaction control block index |
US10296611B2 (en) * | 2014-11-25 | 2019-05-21 | David Wein | Optimized rollover processes to accommodate a change in value identifier bit size and related system reload processes |
US9798759B2 (en) | 2014-11-25 | 2017-10-24 | Sap Se | Delegation of database post-commit processing |
US10127260B2 (en) | 2014-11-25 | 2018-11-13 | Sap Se | In-memory database system providing lockless read and write operations for OLAP and OLTP transactions |
US9792318B2 (en) | 2014-11-25 | 2017-10-17 | Sap Se | Supporting cursor snapshot semantics |
US9898551B2 (en) | 2014-11-25 | 2018-02-20 | Sap Se | Fast row to page lookup of data table using capacity index |
US10732796B2 (en) | 2017-03-29 | 2020-08-04 | Microsoft Technology Licensing, Llc | Control of displayed activity information using navigational mnemonics |
US10671245B2 (en) | 2017-03-29 | 2020-06-02 | Microsoft Technology Licensing, Llc | Collection and control of user activity set data and activity set user interface |
US10853220B2 (en) | 2017-04-12 | 2020-12-01 | Microsoft Technology Licensing, Llc | Determining user engagement with software applications |
US10693748B2 (en) | 2017-04-12 | 2020-06-23 | Microsoft Technology Licensing, Llc | Activity feed service |
US20190050378A1 (en) * | 2017-08-11 | 2019-02-14 | Microsoft Technology Licensing, Llc | Serializable and serialized interaction representations |
US11580088B2 (en) | 2017-08-11 | 2023-02-14 | Microsoft Technology Licensing, Llc | Creation, management, and transfer of interaction representation sets |
US10554591B2 (en) * | 2017-08-30 | 2020-02-04 | Facebook, Inc. | Techniques for efficient messaging client communication |
US20220398235A1 (en) * | 2021-06-11 | 2022-12-15 | Actian Corporation | Method and apparatus for storing object tokens in a database |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005519376A (ja) * | 2002-02-28 | 2005-06-30 | アクサルト・エス・アー | 構造化ソフトウェアオブジェクトについての反復式シリアライゼーションプロシージャ |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5634123A (en) * | 1993-07-08 | 1997-05-27 | Park City Group, Inc. | Data management using nested records and code points |
US5568639A (en) * | 1993-11-24 | 1996-10-22 | Menai Corporation | Method and apparatus for providing an object-oriented file structuring system on a computer |
US5600831A (en) * | 1994-02-28 | 1997-02-04 | Lucent Technologies Inc. | Apparatus and methods for retrieving information by modifying query plan based on description of information sources |
US5727203A (en) * | 1995-03-31 | 1998-03-10 | Sun Microsystems, Inc. | Methods and apparatus for managing a database in a distributed object operating environment using persistent and transient cache |
US6134558A (en) * | 1997-10-31 | 2000-10-17 | Oracle Corporation | References that indicate where global database objects reside |
US6012067A (en) * | 1998-03-02 | 2000-01-04 | Sarkar; Shyam Sundar | Method and apparatus for storing and manipulating objects in a plurality of relational data managers on the web |
GB2366926A (en) * | 2000-09-06 | 2002-03-20 | Sony Uk Ltd | Combining material and data |
US7865596B2 (en) * | 2000-11-02 | 2011-01-04 | Oracle America, Inc. | Switching system for managing storage in digital networks |
US6631130B1 (en) * | 2000-11-21 | 2003-10-07 | Transwitch Corporation | Method and apparatus for switching ATM, TDM, and packet data through a single communications switch while maintaining TDM timing |
US7178100B2 (en) * | 2000-12-15 | 2007-02-13 | Call Charles G | Methods and apparatus for storing and manipulating variable length and fixed length data elements as a sequence of fixed length integers |
US6904454B2 (en) * | 2001-03-21 | 2005-06-07 | Nokia Corporation | Method and apparatus for content repository with versioning and data modeling |
US7181572B2 (en) * | 2002-12-02 | 2007-02-20 | Silverbrook Research Pty Ltd | Cache updating method and apparatus |
US7051042B2 (en) * | 2003-05-01 | 2006-05-23 | Oracle International Corporation | Techniques for transferring a serialized image of XML data |
US6941316B2 (en) | 2003-10-23 | 2005-09-06 | Microsoft Corporation | System and method for object persistence in a database store |
US20050234986A1 (en) | 2004-04-09 | 2005-10-20 | Microsoft Corporation | Systems and methods for fragment-based serialization |
-
2004
- 2004-04-09 US US10/821,687 patent/US20050234986A1/en not_active Abandoned
- 2004-07-29 CN CNA2004800017149A patent/CN1761956A/zh active Pending
- 2004-07-29 KR KR1020057010619A patent/KR20070053083A/ko not_active Application Discontinuation
- 2004-07-29 WO PCT/US2004/024539 patent/WO2005103937A1/en not_active Application Discontinuation
- 2004-07-29 JP JP2007507295A patent/JP2007532998A/ja active Pending
- 2004-07-29 EP EP04779553A patent/EP1618487A4/en not_active Withdrawn
-
2005
- 2005-06-15 US US11/154,496 patent/US7702637B2/en not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005519376A (ja) * | 2002-02-28 | 2005-06-30 | アクサルト・エス・アー | 構造化ソフトウェアオブジェクトについての反復式シリアライゼーションプロシージャ |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006277742A (ja) * | 2005-03-28 | 2006-10-12 | Microsoft Corp | Udtに対するデータフォーマットについてストリーミングチェックを行うシステムおよび方法 |
Also Published As
Publication number | Publication date |
---|---|
WO2005103937A1 (en) | 2005-11-03 |
US20050234986A1 (en) | 2005-10-20 |
EP1618487A4 (en) | 2010-02-17 |
KR20070053083A (ko) | 2007-05-23 |
EP1618487A1 (en) | 2006-01-25 |
CN1761956A (zh) | 2006-04-19 |
US7702637B2 (en) | 2010-04-20 |
US20050234868A1 (en) | 2005-10-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2007532998A (ja) | フラグメントベースのシリアライゼーションのシステムおよび方法 | |
EP0662228B1 (en) | Apparatus for data storage and retrieval | |
US6789094B2 (en) | Method and apparatus for providing extended file attributes in an extended attribute namespace | |
KR101119290B1 (ko) | 정보 처리 장치, 데이터베이스 시스템, 정보 처리 방법 및 프로그램 | |
JP4604041B2 (ja) | 集合値化された列とスカラ値化された列を単一のステートメントで修正するためのsql言語の拡張 | |
US6339777B1 (en) | Method and system for handling foreign key update in an object-oriented database environment | |
CN101685468B (zh) | 采用可搜索块的内容可寻址存储系统和方法 | |
US6725223B2 (en) | Storage format for encoded vector indexes | |
US6850929B2 (en) | System and method for managing file system extended attributes | |
US6862599B2 (en) | Software-based methodology for the storage and retrieval of diverse information | |
JP2010157204A (ja) | 検索可能なブロックを用いた連想記憶システムおよびその方法 | |
KR20060045659A (ko) | B-트리의 연속키들을 재명명하는 방법 및 시스템 | |
Wartik | Boolean Operations. | |
JPH05189490A (ja) | 関数結果をセーブし検索する方法と装置 | |
JP4825719B2 (ja) | 高速ファイル属性検索 | |
US8037058B2 (en) | Reducing access time for data in file systems when seek requests are received ahead of access requests | |
AU2019425530B2 (en) | Systems and methods for hash chain migrations | |
US6092092A (en) | Gap-based style-run array mechanism | |
EP2164005B1 (en) | Content addressable storage systems and methods employing searchable blocks | |
JPH09305449A (ja) | データベース管理システム | |
JPH07319874A (ja) | 文書処理装置 | |
McKenney et al. | Structured Large Objects in Databases | |
JPH04246773A (ja) | データベース管理システム | |
JPH07262223A (ja) | 自動索引作成装置 | |
JPH06110757A (ja) | データ管理方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20100525 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20101019 |