JP2001526421A - 異なるフレームワークバージョンで作成されたオブジェクト指向プログラムが通信することを可能にする装置および方法 - Google Patents
異なるフレームワークバージョンで作成されたオブジェクト指向プログラムが通信することを可能にする装置および方法Info
- Publication number
- JP2001526421A JP2001526421A JP2000524719A JP2000524719A JP2001526421A JP 2001526421 A JP2001526421 A JP 2001526421A JP 2000524719 A JP2000524719 A JP 2000524719A JP 2000524719 A JP2000524719 A JP 2000524719A JP 2001526421 A JP2001526421 A JP 2001526421A
- Authority
- JP
- Japan
- Prior art keywords
- object information
- stream
- information
- original
- program
- 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
- 238000000034 method Methods 0.000 title claims abstract description 42
- 238000004590 computer program Methods 0.000 claims description 18
- 230000006870 function Effects 0.000 description 84
- 238000010586 diagram Methods 0.000 description 31
- 230000008569 process Effects 0.000 description 8
- 230000006399 behavior Effects 0.000 description 7
- 239000012634 fragment Substances 0.000 description 7
- 230000002085 persistent effect Effects 0.000 description 7
- 239000000872 buffer Substances 0.000 description 5
- 238000011161 development Methods 0.000 description 5
- 238000006467 substitution reaction Methods 0.000 description 5
- 238000004891 communication Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 238000003619 Marshal aromatic alkylation reaction Methods 0.000 description 2
- 238000007792 addition Methods 0.000 description 2
- 238000013459 approach Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000005538 encapsulation Methods 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 239000000047 product Substances 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000001276 controlling effect Effects 0.000 description 1
- 238000007796 conventional method Methods 0.000 description 1
- 230000006378 damage Effects 0.000 description 1
- 238000013144 data compression Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 230000006855 networking Effects 0.000 description 1
- 238000007639 printing Methods 0.000 description 1
- 230000001105 regulatory effect Effects 0.000 description 1
- 239000013589 supplement Substances 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/541—Interprogram communication via adapters, e.g. between incompatible applications
-
- 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
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99951—File or database maintenance
- Y10S707/99952—Coherency, e.g. same view to multiple users
- Y10S707/99953—Recoverability
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99951—File or database maintenance
- Y10S707/99952—Coherency, e.g. same view to multiple users
- Y10S707/99954—Version management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
(57)【要約】
バージョン間のミスマッチが原因で起こるクラスの欠落という問題にもかかわらず、オブジェクトフレームワークが相互に通信できるようにする、ストリームライタとリーダのクラスおよびメソッド群が提供されている。ストリームライタは、将来のオブジェクトクラス情報がストリーム化されるとき、既存バージョンと互換性のある代替オブジェクト情報を書くことによって既存バージョンのクラスから拡張する新バージョンのクラスを取り扱うように改良されている。このようにして、代替オブジェクト情報は各より古いバージョン用に書かれる。各より古いバージョンに対応する、代替オブジェクトの各々の情報は既存オブジェクト情報の後にエクステンションとして追加され、そのエクステンションの長さは先頭に書かれている。ストリームリーダは、より古いバージョンのストリームリーダがオブジェクト情報を読み取りが、最初の代替オブジェクト(これは以後のバージョンに対応している場合がある)を理解しないとき、そのエクステンションで指定された長さをスキップし、2番目の代替オブジェクトを読み取るように改良されている。2番目の代替オブジェクト情報が理解できないときは、リーダはその理解不能オブジェクト情報をスキップし、各代替オブジェクトついて継続する。代替オブジェクトのどれもが理解されなかったときは、例外がスロー (throw) される。ある実施例では、使用されない代替オブジェクトの情報は破棄されないが、代わりに一時記憶域に格納される。そのあと、オブジェクトが再びストリームアウトされると、格納情報が追加され、ストリームに戻される。
Description
【0001】 (発明の分野) 本発明はオブジェクト指向システムフレームワークから作成されたオブジェク
ト指向コンピュータプログラム、および、その基礎となるシステムフレームワー
クが変更されたとき、かかるプログラムの互換性を保証するための装置および方
法に関する。
ト指向コンピュータプログラム、および、その基礎となるシステムフレームワー
クが変更されたとき、かかるプログラムの互換性を保証するための装置および方
法に関する。
【0002】 (発明の背景) ソフトウェアプログラムは絶えず複雑化している。初期のプログラムは単純な
手続き型コードから構成され、単純なコマンドラインインタフェースとテキスト
ディスプレイをユーザに提供していた。これらの単純なプログラムは、グラフィ
カルユーザインタフェースと多数の機能を備えた複雑なプログラムで徐々に置き
換えられている。
手続き型コードから構成され、単純なコマンドラインインタフェースとテキスト
ディスプレイをユーザに提供していた。これらの単純なプログラムは、グラフィ
カルユーザインタフェースと多数の機能を備えた複雑なプログラムで徐々に置き
換えられている。
【0003】 プログラムが複雑化するのに伴い、プログラムを書き、デバッグするために必
要とされる作業量も、激増している。その結果、作業の大部分は、最新で、完全
機能を備えたプロダクトを作成するために必要なプログラミング量を低減化する
ことに向けられている。これらの作業で最も成功したものの1つは、オブジェク
ト指向プログラミング (object-oriented programming) の開発であり、そこで はプログラムは「オブジェクト」と呼ばれる、個々のエレメントの集まりとして
設計されている。オブジェクトは、多くの場合、修正と再利用が可能であるため
開発作業が軽減化されている。
要とされる作業量も、激増している。その結果、作業の大部分は、最新で、完全
機能を備えたプロダクトを作成するために必要なプログラミング量を低減化する
ことに向けられている。これらの作業で最も成功したものの1つは、オブジェク
ト指向プログラミング (object-oriented programming) の開発であり、そこで はプログラムは「オブジェクト」と呼ばれる、個々のエレメントの集まりとして
設計されている。オブジェクトは、多くの場合、修正と再利用が可能であるため
開発作業が軽減化されている。
【0004】 この分野の精通者ならば理解されるように、オブジェクト指向プログラミング
で言う意味のオブジェクトとは、データとそのデータに作用を及ぼすオペレーシ
ョンを含むソフトウェアエンティティ(entity)のことである。オブジェクトは
プログラムのランタイムにのみ存在し、プログラマによって実際に書かれたオブ
ジェクトの「クラス」から作成されている。つまり、そのインスタンスが生成さ
れている。あるプログラマによって書かれたクラスコードは、そのコードからオ
ブジェクトのインスタンスを生成することにより、別のプログラマによる「再利
用」が可能になっている。さらに、開発者は、継承 (inheritance) と呼ばれる プロセスによって新しいクラスを既存のクラスから派生することにより、クラス
コードを再利用することができる。周知のように、派生クラス、つまり、サブク
ラスは、それが派生される元のクラスの特性を継承している。継承された特性は
オーバライドし、派生クラスをカスタマイズするように変更することができる。
で言う意味のオブジェクトとは、データとそのデータに作用を及ぼすオペレーシ
ョンを含むソフトウェアエンティティ(entity)のことである。オブジェクトは
プログラムのランタイムにのみ存在し、プログラマによって実際に書かれたオブ
ジェクトの「クラス」から作成されている。つまり、そのインスタンスが生成さ
れている。あるプログラマによって書かれたクラスコードは、そのコードからオ
ブジェクトのインスタンスを生成することにより、別のプログラマによる「再利
用」が可能になっている。さらに、開発者は、継承 (inheritance) と呼ばれる プロセスによって新しいクラスを既存のクラスから派生することにより、クラス
コードを再利用することができる。周知のように、派生クラス、つまり、サブク
ラスは、それが派生される元のクラスの特性を継承している。継承された特性は
オーバライドし、派生クラスをカスタマイズするように変更することができる。
【0005】 開発作業の負担をさらに軽減するために、オブジェクト指向プログラミングを
サポートする多くの製品は、開発者が上述したインスタンス生成とサブクラス化
によって使用し、再使用できるクラスライブラリを提供している。このようなラ
イブラリと継承の原理を利用すると、開発者は、そのコンテンツと振る舞いが異
なっていても、同じインタフェースを共有する関連オブジェクトのファミリを作
成し、使用することができる。
サポートする多くの製品は、開発者が上述したインスタンス生成とサブクラス化
によって使用し、再使用できるクラスライブラリを提供している。このようなラ
イブラリと継承の原理を利用すると、開発者は、そのコンテンツと振る舞いが異
なっていても、同じインタフェースを共有する関連オブジェクトのファミリを作
成し、使用することができる。
【0006】 クラスライブラリは非常に有用であるとしても、いくつかの欠点がある。例え
ば、大きなクラスライブラリは、場合によっては、数百のクラスを含んでいるこ
とがあるため、クラスの関係が非常に紛らわしくなっている。開発者が詳細なド
キュメンテーションをもっていなければ、クラスがどのような関数を実行するこ
とになっているかを、理解することが困難になっている。また、クラスの関係と
オペレーションを完全に理解していないと、変更や追加を行うことが困難になる
場合もある。さらに、クラスライブラリを使用して書かれたプログラムは、制御
の流れや、クラスからインスタンス生成されたオブジェクト間のやりとりに責任
を持つことが依然として要求されている。
ば、大きなクラスライブラリは、場合によっては、数百のクラスを含んでいるこ
とがあるため、クラスの関係が非常に紛らわしくなっている。開発者が詳細なド
キュメンテーションをもっていなければ、クラスがどのような関数を実行するこ
とになっているかを、理解することが困難になっている。また、クラスの関係と
オペレーションを完全に理解していないと、変更や追加を行うことが困難になる
場合もある。さらに、クラスライブラリを使用して書かれたプログラムは、制御
の流れや、クラスからインスタンス生成されたオブジェクト間のやりとりに責任
を持つことが依然として要求されている。
【0007】 以上の結果として、アプリケーション開発作業をさらに軽減化するために、「
フレームワーク」と呼ばれる別のアプローチが使用されている。フレームワーク
とは、関連をもつクラスが集まったもので、お互いに協力し合って特定の問題を
解決するオブジェクトの集まりを生成し、前もって作られた実働アプリケーショ
ン (working application) の構造を提供している。フレームワークはオブジェ クトテクノロジを基礎にしているので、オブジェクトの振る舞いを継承し、オー
バライドすることによって、開発者はフレームワークを拡張し、特定の専門分野
でカスタマイズしたソリューションを作成することが可能になっている。しかし
、フレームワークによって解決される問題は、クラスライブラリ内の個々のオブ
ジェクトによって解決される問題以上に、はるかにハイレベルである。例えば、
フレームワーク内のオブジェクトを使用すると、基本的なワードプロセッサアプ
リケーションが得られるのに対し、クラスライブラリを使用すると、テキストス
トリングの選択やコピーといったように、ワードプロセッサの個々の機能が得ら
れることがある。問題は、クラスライブラリまたはフレームワークのどちらかを
使用してアプリケーションプログラムを開発するときにも、起こっている。これ
らの問題が起こるのは、クラスライブラリとフレームワームが変更されることが
あり、新バージョンのクラスライブラリやフレームワークがクラスを除去したり
、新しいクラスを追加したりすることがあり得るからである。そのあとで、2つ
の異なるバージョンのフレームワークを使用して書かれたアプリケーションプロ
グラムが通信して、オブジェクトをやりとりしようとしたとき、双方のプログラ
ムが理解するオブジェクトが異なるので問題が起こっている。
フレームワーク」と呼ばれる別のアプローチが使用されている。フレームワーク
とは、関連をもつクラスが集まったもので、お互いに協力し合って特定の問題を
解決するオブジェクトの集まりを生成し、前もって作られた実働アプリケーショ
ン (working application) の構造を提供している。フレームワークはオブジェ クトテクノロジを基礎にしているので、オブジェクトの振る舞いを継承し、オー
バライドすることによって、開発者はフレームワークを拡張し、特定の専門分野
でカスタマイズしたソリューションを作成することが可能になっている。しかし
、フレームワークによって解決される問題は、クラスライブラリ内の個々のオブ
ジェクトによって解決される問題以上に、はるかにハイレベルである。例えば、
フレームワーク内のオブジェクトを使用すると、基本的なワードプロセッサアプ
リケーションが得られるのに対し、クラスライブラリを使用すると、テキストス
トリングの選択やコピーといったように、ワードプロセッサの個々の機能が得ら
れることがある。問題は、クラスライブラリまたはフレームワークのどちらかを
使用してアプリケーションプログラムを開発するときにも、起こっている。これ
らの問題が起こるのは、クラスライブラリとフレームワームが変更されることが
あり、新バージョンのクラスライブラリやフレームワークがクラスを除去したり
、新しいクラスを追加したりすることがあり得るからである。そのあとで、2つ
の異なるバージョンのフレームワークを使用して書かれたアプリケーションプロ
グラムが通信して、オブジェクトをやりとりしようとしたとき、双方のプログラ
ムが理解するオブジェクトが異なるので問題が起こっている。
【0008】 例えば、プログラムは、一方のプログラムから他方のプログラムへのデータを
ストリーム化することで、互いに通信することがよくある。このようなストリー
ミングオペレーションでは、ストリームライタは、オブジェクト情報をフラット
化して、つまり、マーシャリング (marshal) してシリアルデータストリームを 形成している。このオブジェクト情報は、オブジェクトを作成するために使用さ
れたクラス情報の形体になっている。クラス情報は、オリジナルオブジェクトを
作成するために使用されたオリジナルクラス情報にすることができるが、そのオ
リジナルオブジェクトが別のオブジェクトの拡張であった場合には、拡張情報だ
けが送られる場合もある。
ストリーム化することで、互いに通信することがよくある。このようなストリー
ミングオペレーションでは、ストリームライタは、オブジェクト情報をフラット
化して、つまり、マーシャリング (marshal) してシリアルデータストリームを 形成している。このオブジェクト情報は、オブジェクトを作成するために使用さ
れたクラス情報の形体になっている。クラス情報は、オリジナルオブジェクトを
作成するために使用されたオリジナルクラス情報にすることができるが、そのオ
リジナルオブジェクトが別のオブジェクトの拡張であった場合には、拡張情報だ
けが送られる場合もある。
【0009】 シリアルデータストリームは、そのあと、別のアプリケーションに送られ、そ
こでは、ストリームリーダがシリアルデータストリームを復元して、つまり、デ
マーシャリング (de-marshal) してオリジナルオブジェクトのコピーを再構築し
ている。クラス情報が送信された場合は、このクラス情報がオブジェクトを構築
するために使用される。これとは別に、拡張データだけが送信された場合は、こ
のデータは送り先にすでに存在するクラス情報と結合され、オブジェクトを構築
するために使用される。通常、このようなオペレーションを行っても、問題は起
こらないが、2つの異なるフレームワークバージョンから作られたアプリケーシ
ョンプログラムが通信しようとすると、困難な問題が起こることがある。明らか
なように、将来バージョンは新しいクラスを含んでいることがあり得るので、現
行フレームワークバージョンにとって未知のクラスが、将来バージョンで書かれ
たストリーム上に存在することがある。しかし、旧クラスのいくつかが新バージ
ョンで削除されていると、将来バージョンは、過去のバージョンからのストリー
ム上のクラスのいくつかを認識できないことになる。多くのフレームワークでは
、ストリームリーダはインテリジェント機能をもっているので、読み取っている
オブジェクトデータが、それが一部となっているフレームワーク内のクラスデー
タに対応しているかどうかを認識できるようになっている。ストリームリーダが
認識しないオブジェクトデータが見つかったとき、ストリームリーダは、そのス
トリームが読み取り不能であると通知するだけである。
こでは、ストリームリーダがシリアルデータストリームを復元して、つまり、デ
マーシャリング (de-marshal) してオリジナルオブジェクトのコピーを再構築し
ている。クラス情報が送信された場合は、このクラス情報がオブジェクトを構築
するために使用される。これとは別に、拡張データだけが送信された場合は、こ
のデータは送り先にすでに存在するクラス情報と結合され、オブジェクトを構築
するために使用される。通常、このようなオペレーションを行っても、問題は起
こらないが、2つの異なるフレームワークバージョンから作られたアプリケーシ
ョンプログラムが通信しようとすると、困難な問題が起こることがある。明らか
なように、将来バージョンは新しいクラスを含んでいることがあり得るので、現
行フレームワークバージョンにとって未知のクラスが、将来バージョンで書かれ
たストリーム上に存在することがある。しかし、旧クラスのいくつかが新バージ
ョンで削除されていると、将来バージョンは、過去のバージョンからのストリー
ム上のクラスのいくつかを認識できないことになる。多くのフレームワークでは
、ストリームリーダはインテリジェント機能をもっているので、読み取っている
オブジェクトデータが、それが一部となっているフレームワーク内のクラスデー
タに対応しているかどうかを認識できるようになっている。ストリームリーダが
認識しないオブジェクトデータが見つかったとき、ストリームリーダは、そのス
トリームが読み取り不能であると通知するだけである。
【0010】 この問題に対処する従来の方法の1つでは、ストリームの先頭にオブジェクト
のバージョン番号を挿入している。ストリームライタはクラスエレメントのどれ
かをストリームに書く前に、オブジェクトのバージョン番号を挿入している。ス
トリームリーダはストリームを受け取ると、オブジェクトバージョンを読み取り
、そのあと、オブジェクトをそのバージョンに見合った方法で処理している。例
えば、異なるバージョンを取り扱う一般的な方法では、新しいフレームワークバ
ージョンのストリームライタがバージョン番号を大きくしてから、その番号をス
トリームに書くことを要求しているが、これは新バージョンが新しいストリーミ
ングフォーマットになっているからである。さらに、新フレームワークバージョ
ンのストリームリーダは、旧バージョンのクラスを読み取る能力をもっているこ
とが要求されている。この従来の解決方法は、新バージョンのストリームリーダ
が旧バージョンのファイルを読み取るときは効率よく働くが、ファイルに新バー
ジョンのクラスが含まれていると、そのファイルは、旧フレームワークバージョ
ンのストリームリーダで読み取ることができなくなる。この問題は、ストリーム
化オブジェクトの終わりを示さないストリームライタではさらに悪化している。
このケースでは、ストリームリーダは未知のクラス情報を単純にスキップできな
いため、ストリームに未知のクラスが含まれていると、そのクラスから以降が読
み取れないことになる。
のバージョン番号を挿入している。ストリームライタはクラスエレメントのどれ
かをストリームに書く前に、オブジェクトのバージョン番号を挿入している。ス
トリームリーダはストリームを受け取ると、オブジェクトバージョンを読み取り
、そのあと、オブジェクトをそのバージョンに見合った方法で処理している。例
えば、異なるバージョンを取り扱う一般的な方法では、新しいフレームワークバ
ージョンのストリームライタがバージョン番号を大きくしてから、その番号をス
トリームに書くことを要求しているが、これは新バージョンが新しいストリーミ
ングフォーマットになっているからである。さらに、新フレームワークバージョ
ンのストリームリーダは、旧バージョンのクラスを読み取る能力をもっているこ
とが要求されている。この従来の解決方法は、新バージョンのストリームリーダ
が旧バージョンのファイルを読み取るときは効率よく働くが、ファイルに新バー
ジョンのクラスが含まれていると、そのファイルは、旧フレームワークバージョ
ンのストリームリーダで読み取ることができなくなる。この問題は、ストリーム
化オブジェクトの終わりを示さないストリームライタではさらに悪化している。
このケースでは、ストリームリーダは未知のクラス情報を単純にスキップできな
いため、ストリームに未知のクラスが含まれていると、そのクラスから以降が読
み取れないことになる。
【0011】 以上に鑑みて、望まれていることは、後方データ互換性と前方データ互換性の
両方をもつフレームワークシステムを実現し、異なるバージョンのフレームワー
クで設計されたアプリケーションプログラムが通信できるようにすることである
。後方データ互換性とは、以前バージョンのフレームワークで生成されたストリ
ームを読み取れるようにすることであり、前方データ互換性とは、将来バージョ
ンのフレームワークで生成されたストリームを読み取れるようにすることである
。
両方をもつフレームワークシステムを実現し、異なるバージョンのフレームワー
クで設計されたアプリケーションプログラムが通信できるようにすることである
。後方データ互換性とは、以前バージョンのフレームワークで生成されたストリ
ームを読み取れるようにすることであり、前方データ互換性とは、将来バージョ
ンのフレームワークで生成されたストリームを読み取れるようにすることである
。
【0012】 (発明の概要) 本発明の原理によれば、バージョンのミスマッチが原因でクラスが欠落すると
いう問題にもかかわらず、オブジェクトフレームワークが相互に通信することを
可能にする、ストリームライタとリーダのクラスおよびメソッド群が提供されて
いる。ストリームライタは、将来のオブジェクトクラス情報がストリーム化され
るとき、既存バージョンと互換性のある代替オブジェクト情報を書くことによっ
て、既存バージョンのクラスから拡張された新バージョンのクラスを取り扱うよ
うに改良されている。この方法によると、代替オブジェクト情報は各々の旧バー
ジョンごとに書かれることになる。各旧バージョンに対応する代替オブジェクト
の各々の情報は、既存オブジェクト情報の後にエクステンションとして追加され
、そのエクステンションの長さは先頭に置かれている。ストリームリーダは、旧
バージョンのストリームリーダがオブジェクト情報を読み取り、最初の代替オブ
ジェクト(これは以後のバージョンに対応している場合もある)を理解しないと
き、そのエクステンションで指定された長さをスキップし、2番目の代替オブジ
ェクトを読み取るように改良されている。2番目の代替オブジェクト情報が理解
されないときは、リーダはその理解不能オブジェクト情報をスキップし、各代替
オブジェクトについて上記処理を続けていく。代替オブジェクトのいずれも理解
されないときは、例外がスロー (throw) される。
いう問題にもかかわらず、オブジェクトフレームワークが相互に通信することを
可能にする、ストリームライタとリーダのクラスおよびメソッド群が提供されて
いる。ストリームライタは、将来のオブジェクトクラス情報がストリーム化され
るとき、既存バージョンと互換性のある代替オブジェクト情報を書くことによっ
て、既存バージョンのクラスから拡張された新バージョンのクラスを取り扱うよ
うに改良されている。この方法によると、代替オブジェクト情報は各々の旧バー
ジョンごとに書かれることになる。各旧バージョンに対応する代替オブジェクト
の各々の情報は、既存オブジェクト情報の後にエクステンションとして追加され
、そのエクステンションの長さは先頭に置かれている。ストリームリーダは、旧
バージョンのストリームリーダがオブジェクト情報を読み取り、最初の代替オブ
ジェクト(これは以後のバージョンに対応している場合もある)を理解しないと
き、そのエクステンションで指定された長さをスキップし、2番目の代替オブジ
ェクトを読み取るように改良されている。2番目の代替オブジェクト情報が理解
されないときは、リーダはその理解不能オブジェクト情報をスキップし、各代替
オブジェクトについて上記処理を続けていく。代替オブジェクトのいずれも理解
されないときは、例外がスロー (throw) される。
【0013】 ある実施形態では、使用されない代替オブジェクトの情報は破棄されるのでは
なく、テンポラリストレージ(「ビットバケット」)に格納される。そのあと、
オブジェクトが再びストリームアウトされたときは、ストアされた情報が追加さ
れ、ストリームに戻される。このようにすると、データは損失しない。
なく、テンポラリストレージ(「ビットバケット」)に格納される。そのあと、
オブジェクトが再びストリームアウトされたときは、ストアされた情報が追加さ
れ、ストリームに戻される。このようにすると、データは損失しない。
【0014】 (好適実施形態の詳細な説明) 図1は、IBM THINKPAD 701(登録商標)コンピュータのように、ここに開示さ
れているフレームワークバージョン通信システムを実装させることができる、例
示のクライアントコンピュータ100のシステムアーキテクチャを示す。図1の
例示コンピュータシステムは単に説明目的のために議論されているが、当然のこ
とながら、本発明を限定するものではない。以下の説明では、特定のコンピュー
タシステムを説明するとき普通に用いられる用語が引用されることがあるが、下
述の概念は他のコンピュータシステムにも等しく適用され、この中には、図1に
示すものとは異種のアーキテクチャをもつシステムも含まれている。
れているフレームワークバージョン通信システムを実装させることができる、例
示のクライアントコンピュータ100のシステムアーキテクチャを示す。図1の
例示コンピュータシステムは単に説明目的のために議論されているが、当然のこ
とながら、本発明を限定するものではない。以下の説明では、特定のコンピュー
タシステムを説明するとき普通に用いられる用語が引用されることがあるが、下
述の概念は他のコンピュータシステムにも等しく適用され、この中には、図1に
示すものとは異種のアーキテクチャをもつシステムも含まれている。
【0015】 クライアントコンピュータ100は、中央処理ユニット(CPU)105(これは 従来のマイクロプロセッサを搭載することができる)、情報を一時的に格納して
おくランダムアクセスメモリ(RAM)110、および情報を永続的に格納している リードオンリメモリ(ROM)115を装備している。メモリコントローラ120は システムRAM110を制御するためのものである。バスコントローラ125はバ ス130を制御するためのもので、割り込みコントローラ135は種々の割り込
みシグナル(信号)を他のシステムコンポーネントから受信し、処理するために
使用される。
おくランダムアクセスメモリ(RAM)110、および情報を永続的に格納している リードオンリメモリ(ROM)115を装備している。メモリコントローラ120は システムRAM110を制御するためのものである。バスコントローラ125はバ ス130を制御するためのもので、割り込みコントローラ135は種々の割り込
みシグナル(信号)を他のシステムコンポーネントから受信し、処理するために
使用される。
【0016】 大容量ストレージはディスケット142、CD-ROM147、またはハードディス
ク152で提供することが可能である。データとソフトウェアは、ディスケット
142やCD-ROM147などの取り外し可能媒体を通してクライアントコンピュー
タ100とやりとりすることができる。ディスケット142はディスケットドラ
イブ141に挿入可能であり、このドライブはコントローラ140によってバス
130に接続されている。同様に、CD-ROM147はCD-ROMドライブ146に挿入
可能であり、このドライブはコントローラ145によってバス130に接続され
ている。最後に、ハードディスク152は固定ディスクドライブ151の一部で
あり、このドライブはコントローラ150によってバス130に接続されている
。
ク152で提供することが可能である。データとソフトウェアは、ディスケット
142やCD-ROM147などの取り外し可能媒体を通してクライアントコンピュー
タ100とやりとりすることができる。ディスケット142はディスケットドラ
イブ141に挿入可能であり、このドライブはコントローラ140によってバス
130に接続されている。同様に、CD-ROM147はCD-ROMドライブ146に挿入
可能であり、このドライブはコントローラ145によってバス130に接続され
ている。最後に、ハードディスク152は固定ディスクドライブ151の一部で
あり、このドライブはコントローラ150によってバス130に接続されている
。
【0017】 クライアントコンピュータ100へのユーザ入力は、いくつかのデバイスから
与えることができる。例えば、キーボード156とマウス157は、キーボード
およびマウスコントローラ155によってバス130に接続することができる。
マイクロホンとスピーカ兼用の働きをするオーディオトランスジューサ196は
、オーディオコントローラ197によってバス130に接続されている。この分
野の精通者ならば当然に理解されるように、ペンおよび/またはタブレットおよ
び音声入力用のマイクロホンなどの、他の入力デバイスを、バス130と該当コ
ントローラを通してクライアントコンピュータ100に接続することも可能であ
る。DMAコントローラ160は、システムRAM110に直接メモリアクセスできる
ようにするものである。ビジュアルディスプレイは、ビデオディスプレイ170
を制御するビデオコントローラ165によって生成される。
与えることができる。例えば、キーボード156とマウス157は、キーボード
およびマウスコントローラ155によってバス130に接続することができる。
マイクロホンとスピーカ兼用の働きをするオーディオトランスジューサ196は
、オーディオコントローラ197によってバス130に接続されている。この分
野の精通者ならば当然に理解されるように、ペンおよび/またはタブレットおよ
び音声入力用のマイクロホンなどの、他の入力デバイスを、バス130と該当コ
ントローラを通してクライアントコンピュータ100に接続することも可能であ
る。DMAコントローラ160は、システムRAM110に直接メモリアクセスできる
ようにするものである。ビジュアルディスプレイは、ビデオディスプレイ170
を制御するビデオコントローラ165によって生成される。
【0018】 クライアントコンピュータ100は、クライアントコンピュータ100をバス
191経由でネットワーク195に相互接続できるようにするネットワークアダ
プタ190も装備している。ネットワーク195は、ローカルエリアネットワー
ク(LAN)、広域ネットワーク(WAN)、またはインターネットにすることが可能であ
り、複数のネットワークデバイスを相互接続する汎用通信回線を利用することが
できる。
191経由でネットワーク195に相互接続できるようにするネットワークアダ
プタ190も装備している。ネットワーク195は、ローカルエリアネットワー
ク(LAN)、広域ネットワーク(WAN)、またはインターネットにすることが可能であ
り、複数のネットワークデバイスを相互接続する汎用通信回線を利用することが
できる。
【0019】 コンピュータ100は、一般的に、Apple Computer Corporation (Cupertino,
California) 提供のSYSTEM7(登録商標)オペレーティングシステムまたはInte
rnational Business Machines Corporation (Boca Raton, Florida) 提供のAIX (登録商標)オペレーティングシステムなどの、オペレーティングシステムソフ
トウェアによって制御され、調整されている。従来のオペレーティングシステム
は、特に、コンピュータプロセスの制御と実行のスケジューリングを行い、メモ
リ管理を実行し、ファイルシステム、ネットワーキング、および入出力(I/O) サ
ービスを提供し、グラフィカルユーザインタフェース(GUI) などのユーザイン タフェースを提供している。エディタやスプレッドシートなどのユーザアプリケ
ーションは、直接的にも、間接的にも、オペレーティングシステムの上記および
他の機能に依存している。
California) 提供のSYSTEM7(登録商標)オペレーティングシステムまたはInte
rnational Business Machines Corporation (Boca Raton, Florida) 提供のAIX (登録商標)オペレーティングシステムなどの、オペレーティングシステムソフ
トウェアによって制御され、調整されている。従来のオペレーティングシステム
は、特に、コンピュータプロセスの制御と実行のスケジューリングを行い、メモ
リ管理を実行し、ファイルシステム、ネットワーキング、および入出力(I/O) サ
ービスを提供し、グラフィカルユーザインタフェース(GUI) などのユーザイン タフェースを提供している。エディタやスプレッドシートなどのユーザアプリケ
ーションは、直接的にも、間接的にも、オペレーティングシステムの上記および
他の機能に依存している。
【0020】 好適実施形態では、本発明は、オブジェクト指向プログラミング技法を使用し
てC++プログラミング言語で実現されている。この分野の精通者ならば理解され るように、オブジェクト指向プログラミング (OOP) のオブジェクトは、データ 構造とデータに作用を及ぼすオペレーションを含むソフトウェアエンティティで
ある。これらのエレメントが一緒になって、オブジェクトが、そのデータエレメ
ントで表された特性とそのデータ操作関数で表された振る舞いからとらえて、ほ
とんどどの実世界エンティティでもモデル化することを可能にしている。このよ
うにして、オブジェクトは、人やコンピュータのような具体的な物をモデル化す
ることも、数のような抽象的概念や幾何学的概念をモデル化することも可能にな
っている。オブジェクトテクノロジの利点は次の3つの基本原理から生じている
。すなわち、カプセル化、多態および継承である。
てC++プログラミング言語で実現されている。この分野の精通者ならば理解され るように、オブジェクト指向プログラミング (OOP) のオブジェクトは、データ 構造とデータに作用を及ぼすオペレーションを含むソフトウェアエンティティで
ある。これらのエレメントが一緒になって、オブジェクトが、そのデータエレメ
ントで表された特性とそのデータ操作関数で表された振る舞いからとらえて、ほ
とんどどの実世界エンティティでもモデル化することを可能にしている。このよ
うにして、オブジェクトは、人やコンピュータのような具体的な物をモデル化す
ることも、数のような抽象的概念や幾何学的概念をモデル化することも可能にな
っている。オブジェクトテクノロジの利点は次の3つの基本原理から生じている
。すなわち、カプセル化、多態および継承である。
【0021】 オブジェクトは、そのデータの内部構造およびその関数が作用するとき使用さ
れるアルゴリズムを隠蔽している。つまり、カプセル化している。これらの実施
詳細を外部に見せる代わりに、オブジェクトは、その抽象化を表し、クリーンで
外部情報のないインタフェースとなっている。多態はカプセル化を一歩進めたも
のである。その考え方は多数形状、1インタフェースである。ソフトウェアコン
ポーネントは、他のコンポーネントがなんであるかを正確に知らなくても、他の
コンポーネントの要求を行うことができる。要求を受け取る側のコンポーネント
はその要求を解釈し、要求をどのように実行するかを、その変数とデータに従っ
て判断する。第3の原理である継承は、開発者が既存の設計とコードを再利用で
きるようにする。この機能を利用すると、開発者は、ソフトウェアを初めから作
成しないで済むことになる。むしろ、継承によると、開発者は振る舞いを継承す
るサブクラスを派生することにより、開発者の具体的要求に合わせて振る舞いを
カスタマイズすることができる。
れるアルゴリズムを隠蔽している。つまり、カプセル化している。これらの実施
詳細を外部に見せる代わりに、オブジェクトは、その抽象化を表し、クリーンで
外部情報のないインタフェースとなっている。多態はカプセル化を一歩進めたも
のである。その考え方は多数形状、1インタフェースである。ソフトウェアコン
ポーネントは、他のコンポーネントがなんであるかを正確に知らなくても、他の
コンポーネントの要求を行うことができる。要求を受け取る側のコンポーネント
はその要求を解釈し、要求をどのように実行するかを、その変数とデータに従っ
て判断する。第3の原理である継承は、開発者が既存の設計とコードを再利用で
きるようにする。この機能を利用すると、開発者は、ソフトウェアを初めから作
成しないで済むことになる。むしろ、継承によると、開発者は振る舞いを継承す
るサブクラスを派生することにより、開発者の具体的要求に合わせて振る舞いを
カスタマイズすることができる。
【0022】 さらに、好適実施形態では、フレームワークを使用してアプリケーションを開
発する方法も採用されている。プログラミングの立場から見たとき、フレームワ
ークとは、基本的に、相互に関連をもつオブジェクトクラスが集まったものであ
り、あらかじめ作られた実働アプリケーションの構造を提供している。例えば、
ユーザインタフェースフレームワークは、ドローイングウィンドウ、スクロール
バー、メニューなどのサポートと「デフォルト」の振る舞いを提供することもあ
り得る。フレームワークはオブジェクトテクノロジを基礎にしているので、その
振る舞いを継承し、オーバライドすることによって、開発者はフレームワークを
拡張し、特定の専門分野でカスタマイズしたソリューションを作成することがで
きる。開発者が関心を持っているシステムのレベルおよび解決しようとする問題
の種類に応じて、フレームワークには多種類のものがある。フレームワークのタ
イプは、ユーザインタフェースの開発を支援するアプリケーションフレームワー
クから、通信、印刷、ファイルシステムサポート、グラフィックスなどの、基本
的システムソフトウェアサービスを提供する低レベルのフレームワークまでの範
囲にわたっている。商用化されているアプリケーションフレームワークの例とし
て、そのいくつかを挙げると、MacApp (Apple)、Bedrock (Symantec)、OWL (Bor
land)、NeXTStep App Kit (NeXT)、およびSmalltalk-80 MVC (ParcPlace) があ る。
発する方法も採用されている。プログラミングの立場から見たとき、フレームワ
ークとは、基本的に、相互に関連をもつオブジェクトクラスが集まったものであ
り、あらかじめ作られた実働アプリケーションの構造を提供している。例えば、
ユーザインタフェースフレームワークは、ドローイングウィンドウ、スクロール
バー、メニューなどのサポートと「デフォルト」の振る舞いを提供することもあ
り得る。フレームワークはオブジェクトテクノロジを基礎にしているので、その
振る舞いを継承し、オーバライドすることによって、開発者はフレームワークを
拡張し、特定の専門分野でカスタマイズしたソリューションを作成することがで
きる。開発者が関心を持っているシステムのレベルおよび解決しようとする問題
の種類に応じて、フレームワークには多種類のものがある。フレームワークのタ
イプは、ユーザインタフェースの開発を支援するアプリケーションフレームワー
クから、通信、印刷、ファイルシステムサポート、グラフィックスなどの、基本
的システムソフトウェアサービスを提供する低レベルのフレームワークまでの範
囲にわたっている。商用化されているアプリケーションフレームワークの例とし
て、そのいくつかを挙げると、MacApp (Apple)、Bedrock (Symantec)、OWL (Bor
land)、NeXTStep App Kit (NeXT)、およびSmalltalk-80 MVC (ParcPlace) があ る。
【0023】 アプリケーションフレームワークが開発者にプレハブ機能を提供するのと同じ
ように、好適実施形態で採用されているような、システムフレームワークは同じ
考え方を基礎にしてシステムレベルのサービスを提供し、システムプログラマな
どの開発者が、そのサービスを利用してサブクラス化またはオーバライドし、カ
スタマイズしたソリューションを作成できるようにしている。本発明の好適実施
形態は、システムレベルのアプリケーションフレームワークの一部として実現さ
れている。システムレベルのフレームワークは、コンパイルされてアプリケーシ
ョンイメージに組み入れられるのではなく、プラットフォームのイメージとライ
ブラリ群の一部になっている。このようにすると、システムで実行されるアプリ
ケーションは、フレームワークコンポーネントを各アプリケーションのイメージ
に複製しなくても、フレームワークコンポーネントの使用を共有することができ
る。
ように、好適実施形態で採用されているような、システムフレームワークは同じ
考え方を基礎にしてシステムレベルのサービスを提供し、システムプログラマな
どの開発者が、そのサービスを利用してサブクラス化またはオーバライドし、カ
スタマイズしたソリューションを作成できるようにしている。本発明の好適実施
形態は、システムレベルのアプリケーションフレームワークの一部として実現さ
れている。システムレベルのフレームワークは、コンパイルされてアプリケーシ
ョンイメージに組み入れられるのではなく、プラットフォームのイメージとライ
ブラリ群の一部になっている。このようにすると、システムで実行されるアプリ
ケーションは、フレームワークコンポーネントを各アプリケーションのイメージ
に複製しなくても、フレームワークコンポーネントの使用を共有することができ
る。
【0024】 図2は、オブジェクトとクラス情報がどのようにストリーム化されて、フレー
ムワークバージョン2で作られた一方のアプリケーションプログラム200から
、フレームワークバージョン1で作られた他方のアプリケーションプログラム2
16に、データストリームを通して渡されるかを示すハイレベルのブロック概略
s図である。例えば、クラスデータ202の形になったオブジェクト情報は、ア
プリケーション216に送られる属性とメソッドを収めている。このクラス情報
202はストリームライタ204に渡され、ストリームライタは、周知の方法で
データをシリアル化し、それを矢印206で図解して示すようにデータストリー
ム208上に置く。
ムワークバージョン2で作られた一方のアプリケーションプログラム200から
、フレームワークバージョン1で作られた他方のアプリケーションプログラム2
16に、データストリームを通して渡されるかを示すハイレベルのブロック概略
s図である。例えば、クラスデータ202の形になったオブジェクト情報は、ア
プリケーション216に送られる属性とメソッドを収めている。このクラス情報
202はストリームライタ204に渡され、ストリームライタは、周知の方法で
データをシリアル化し、それを矢印206で図解して示すようにデータストリー
ム208上に置く。
【0025】 アプリケーションプログラム216側では、データは、矢印210で図解して
示すようにストリームリーダ212によってデータストリーム208から取り出
される。ストリームリーダ212は、データストリーム上のデータとフレームワ
ーク内のクラス情報の両方を使用して、オリジナルオブジェクト情報202のコ
ピー214を作成する。そのあと、オブジェクトクラス情報は、アプリケーショ
ンプログラム216側で新オブジェクトを構築するために使用される。
示すようにストリームリーダ212によってデータストリーム208から取り出
される。ストリームリーダ212は、データストリーム上のデータとフレームワ
ーク内のクラス情報の両方を使用して、オリジナルオブジェクト情報202のコ
ピー214を作成する。そのあと、オブジェクトクラス情報は、アプリケーショ
ンプログラム216側で新オブジェクトを構築するために使用される。
【0026】 ストリームリーダとストリームライタのオペレーション、およびデータストリ
ーム一般はこの分野では周知である。以下の説明では、CommonpointO System fo
r the AIX(登録商標)オペレーティングシステムという名称で、International
Business Machines Corporation (Armonk, New York) によって開発、販売され
ている特定のシステムフレームワーク群が例として使用され、本発明のオペレー
ションを示すコードの断片がシステムと関連付けて説明されている。Commonpoin
tシステムは、Commonpoint Application System, Version B for AIXという題名
の参考文献群 (Taligent, Inc. 1995) に詳しく説明されているが、その内容は 引用により本明細書に記載されている。以下に説明されているストリーミング関
数は、Foundation Servicesという題名の巻に詳しく説明されている。しかし、 本発明の原理はCommonpointシステムを使用することに限定されるものではなく 、これを例として使用したことは、本発明が他のシステムに応用可能であること
を制限するものではない。
ーム一般はこの分野では周知である。以下の説明では、CommonpointO System fo
r the AIX(登録商標)オペレーティングシステムという名称で、International
Business Machines Corporation (Armonk, New York) によって開発、販売され
ている特定のシステムフレームワーク群が例として使用され、本発明のオペレー
ションを示すコードの断片がシステムと関連付けて説明されている。Commonpoin
tシステムは、Commonpoint Application System, Version B for AIXという題名
の参考文献群 (Taligent, Inc. 1995) に詳しく説明されているが、その内容は 引用により本明細書に記載されている。以下に説明されているストリーミング関
数は、Foundation Servicesという題名の巻に詳しく説明されている。しかし、 本発明の原理はCommonpointシステムを使用することに限定されるものではなく 、これを例として使用したことは、本発明が他のシステムに応用可能であること
を制限するものではない。
【0027】 基本的Commonpointシステムは、以下で説明するように、本発明の原理によれ ば、データ互換性を達成するように改良されているので、以下では、既存のComm
onpointストリーミング関数について簡単に説明することにする。Commonpointシ
ステムでは、Write()関数は、データをデータストリームに書き出すためのメイ ン関数である。これは、以下に示すコードの断片にストリームアウト記号 ">>="
で示されており、データを直接にデータストリームに書き出す。この関数が使 用されるのは、他のオブジェクトインスタンスを指すポインタが関与しないとき
だけである。ポインタをストリーム化する必要があるときは、多態関数であるFl
atten()とResurrect()が使用され、該当データが書き出されることを保証する。
onpointストリーミング関数について簡単に説明することにする。Commonpointシ
ステムでは、Write()関数は、データをデータストリームに書き出すためのメイ ン関数である。これは、以下に示すコードの断片にストリームアウト記号 ">>="
で示されており、データを直接にデータストリームに書き出す。この関数が使 用されるのは、他のオブジェクトインスタンスを指すポインタが関与しないとき
だけである。ポインタをストリーム化する必要があるときは、多態関数であるFl
atten()とResurrect()が使用され、該当データが書き出されることを保証する。
【0028】 Commonpointアプリケーションシステムでは、このグローバル関数は、文字、 整数などの、基本データ型のために用意されたものである。例えば、次に示すコ
ードの断片は、各ストリーム型がデータをどのように書き出すかを示している。
">>="の機能が使用されるときは、これは、実際には、データストリームのWrit
e()関数をコールする。
ードの断片は、各ストリーム型がデータをどのように書き出すかを示している。
">>="の機能が使用されるときは、これは、実際には、データストリームのWrit
e()関数をコールする。
【0029】
【数1】
【0030】 Commonpointシステムでは、ライタは、各々のオブジェクトインスタンスに関 連する「バージョン番号」を書き出す設計になっている。バージョン番号は、イ
ンスタンスの外部表現が変更されると、更新されるようになっている。
ンスタンスの外部表現が変更されると、更新されるようになっている。
【0031】 Read()関数は、情報をデータストリームから読み込むためのCommonpointのメ イン関数である。これは、以下に示すコードの断片にストリームイン記号 "<<="
で示されている。Read()関数は、Write()関数がデータを書き出したのと正確に 同じ順序で、データを読み込まなければならない。例えば、オブジェクa、b、
およびcがストリームに書き出されていれば、リーダは、ストリーム化オブジェ
クトを読み戻してプログラムのメモリスペースに入れるとき、ストリームを順番
に読み戻して、a、b、およびcの突き合わせ変数 (matching variable) に入 れなければならない。"<<="機能が使用されるときは、これは、実際には、デー タストリームのRead()関数をコールする。以下のコードは、上記Write()の例で 使用されたものと同じストリーム (TFileStream f) を使用して、ストリームか らどのように読み取って変数に入れるかを示している。
で示されている。Read()関数は、Write()関数がデータを書き出したのと正確に 同じ順序で、データを読み込まなければならない。例えば、オブジェクa、b、
およびcがストリームに書き出されていれば、リーダは、ストリーム化オブジェ
クトを読み戻してプログラムのメモリスペースに入れるとき、ストリームを順番
に読み戻して、a、b、およびcの突き合わせ変数 (matching variable) に入 れなければならない。"<<="機能が使用されるときは、これは、実際には、デー タストリームのRead()関数をコールする。以下のコードは、上記Write()の例で 使用されたものと同じストリーム (TFileStream f) を使用して、ストリームか らどのように読み取って変数に入れるかを示している。
【0032】
【数2】
【0033】 ポインタともっと複雑なオブジェクトが係わっている場合は、グローバルFlat
ten()関数を使用しなければならない。Flatten()がWrite()関数よりもインテリ ジェントであるのは、ストリーム化されるオリジナルインスタンスに含まれるす
べてのポインタとネストされたインスタンスの後に続いて、この関数が置かれて
いるからである。さらに、Flatten()関数は、オブジェクトインスタンスが復元 されるとき正しいインスタンス構造を保持している。インスタンスへのポインタ
だけがデータストリームに書かれるときは、復元時に、ポインタは結局未知のデ
ータをポイントすることになる。これがランタイムエラーと扱われるのは、ポイ
ンタにアクセスすると、不明の結果が発生するからである。復元情報がフラット
化された情報と正確に同じであることを保証するために、インスタンスに関する
すべての情報がストリームに書き出される。
ten()関数を使用しなければならない。Flatten()がWrite()関数よりもインテリ ジェントであるのは、ストリーム化されるオリジナルインスタンスに含まれるす
べてのポインタとネストされたインスタンスの後に続いて、この関数が置かれて
いるからである。さらに、Flatten()関数は、オブジェクトインスタンスが復元 されるとき正しいインスタンス構造を保持している。インスタンスへのポインタ
だけがデータストリームに書かれるときは、復元時に、ポインタは結局未知のデ
ータをポイントすることになる。これがランタイムエラーと扱われるのは、ポイ
ンタにアクセスすると、不明の結果が発生するからである。復元情報がフラット
化された情報と正確に同じであることを保証するために、インスタンスに関する
すべての情報がストリームに書き出される。
【0034】 さらに、Flatten()関数にはデフォルトの「コンテキスト」が用意されており 、これは、同じオブジェクトインスタンスが、ストリーム化されるデータに2つ
以上存在するときそれを認識する。デフォルトでは、最初のインスタンスだけが
ストリームアウトされ、各類似インスタンスが最初のインスタンスの後でストリ
ームアウトされるたびに識別トークンが書かれるようになっている。トークンだ
けを書くと、ストリーム化されるデータ量が減少するので、データ圧縮による効
率が得られる。以下のコードの断片は、オブジェクトaをフラット化するための
Flatten()関数の使用を示している。
以上存在するときそれを認識する。デフォルトでは、最初のインスタンスだけが
ストリームアウトされ、各類似インスタンスが最初のインスタンスの後でストリ
ームアウトされるたびに識別トークンが書かれるようになっている。トークンだ
けを書くと、ストリーム化されるデータ量が減少するので、データ圧縮による効
率が得られる。以下のコードの断片は、オブジェクトaをフラット化するための
Flatten()関数の使用を示している。
【0035】
【数3】
【0036】 TContext変数は、同じオブジェクトへの複数の参照がフラット化され、同じス
トリーム上で一緒にパックされる場合に使用される。TContextの要素は、反復さ
れるオブジェクトインスタンスへの参照を、格納される1組のオブジェクトから
割り当てるためにフラット化プロセス時に作られる、ダイナミックディクショナ
リである。下に示すコードサンプルは、オブジェクトインスタンスdとaをフラ
ット化するための、複数インスタンスフラット化手法を示している。
トリーム上で一緒にパックされる場合に使用される。TContextの要素は、反復さ
れるオブジェクトインスタンスへの参照を、格納される1組のオブジェクトから
割り当てるためにフラット化プロセス時に作られる、ダイナミックディクショナ
リである。下に示すコードサンプルは、オブジェクトインスタンスdとaをフラ
ット化するための、複数インスタンスフラット化手法を示している。
【0037】
【数4】
【0038】 Resurrect()関数は、フラット化された形のインスタンスを受け取り、それか らオブジェクトインスタンスを生成する。Resurrect()関数はストリームIDとコ ンテキストIDをパラメータとして受け取る。Resurrect()関数にパラメータとし て渡されるストリームはフラット化されたインスタンスを収めている。この関数
に渡されるコンテキストの使い方は、Flatten()関数で説明したものと同じであ る。以下のコードの断片は、オブジェクトAのシングルインスタンスをデータス
トリームaStreamから再構築するための、Resurrect()の使用を示している。
に渡されるコンテキストの使い方は、Flatten()関数で説明したものと同じであ る。以下のコードの断片は、オブジェクトAのシングルインスタンスをデータス
トリームaStreamから再構築するための、Resurrect()の使用を示している。
【0039】
【数5】
【0040】 次のコードの断片は、オブジェクトDとAの2つのオブジェクトインスタンス
を同じストリームから復元する方法を示している。
を同じストリームから復元する方法を示している。
【0041】
【数6】
【0042】 次の断片は、基底クラスのFlattenルーチンを明示的にコールすることによっ て、そのインスタンスの基底クラスをフラット化するカスタムストリームアウト
演算子 (>>=) を定義したものである。これは、そのあと、メンバインスタンス のFlattenルーチンを明示的にコールすることによって、メンバインスタンスを フラット化している。最後に、基本データ型であるそのメンバおよび他のインス
タンスへの参照をフラット化している。単純データ型は、ストリームwrite()メ ンバ関数を使用してデータ型をストリームに書くことによってフラット化される
。他のインスタンスへの参照は、渡されたパラメータを指定してFlattenPointer
()ルーチンを再帰的にコールすることによってフラット化される。この例では、
クラスCはクラスAとBから派生しており、クラスDのメンバインスタンスdを
もち、基本型がlongであるメンバ、基本型がcharであるメンバ、およびEインス
タンス(e) へのポインタをもっているものと想定されている。WriteVersion()関
数は、上述したようにオブジェクトバージョン番号をストリームに書き出す。こ
の関数、および本発明に従って行われた改良については、以下で詳しく説明する
。その例示のコードの断片は次の通りである。
演算子 (>>=) を定義したものである。これは、そのあと、メンバインスタンス のFlattenルーチンを明示的にコールすることによって、メンバインスタンスを フラット化している。最後に、基本データ型であるそのメンバおよび他のインス
タンスへの参照をフラット化している。単純データ型は、ストリームwrite()メ ンバ関数を使用してデータ型をストリームに書くことによってフラット化される
。他のインスタンスへの参照は、渡されたパラメータを指定してFlattenPointer
()ルーチンを再帰的にコールすることによってフラット化される。この例では、
クラスCはクラスAとBから派生しており、クラスDのメンバインスタンスdを
もち、基本型がlongであるメンバ、基本型がcharであるメンバ、およびEインス
タンス(e) へのポインタをもっているものと想定されている。WriteVersion()関
数は、上述したようにオブジェクトバージョン番号をストリームに書き出す。こ
の関数、および本発明に従って行われた改良については、以下で詳しく説明する
。その例示のコードの断片は次の通りである。
【0043】
【数7】
【0044】 上記プロシージャによってフラット化されたオブジェクトを復元するためのカ
スタム化されたストリームイン演算子(<<=) は以下に示されている。ReadVersio
n()関数はWriteVersion()関数と対になるもので、バージョン番号を読み取る。 これについても、以下で詳しく説明する。
スタム化されたストリームイン演算子(<<=) は以下に示されている。ReadVersio
n()関数はWriteVersion()関数と対になるもので、バージョン番号を読み取る。 これについても、以下で詳しく説明する。
【0045】
【数8】
【0046】 (概観) 異なるフレームワークバージョンで作られたアプリケーションプログラム間の
データ互換性という大きな問題は、いくつかの小さな問題を含んでいる。例えば
、データの非互換性はクラスバージョンのミスマッチとクラスの欠落が原因で起
こっている。また、非互換性が処理されるときデータ損失という問題もある。最
後に、基礎となるフレームワークバージョンのどれも使用しないで作られたアプ
リケーションがデータストリームを読み取るという問題がある。
データ互換性という大きな問題は、いくつかの小さな問題を含んでいる。例えば
、データの非互換性はクラスバージョンのミスマッチとクラスの欠落が原因で起
こっている。また、非互換性が処理されるときデータ損失という問題もある。最
後に、基礎となるフレームワークバージョンのどれも使用しないで作られたアプ
リケーションがデータストリームを読み取るという問題がある。
【0047】 1. クラスバージョンのミスマッチ クラスバージョンのミスマッチ問題は、ストリームリーダが未知バージョンの
クラスをストリーム上に見つけたとき発生している。具体的には、未知バージョ
ンは、既知クラスには未知エクステンションとして見えるのが一般的である。本
発明の原理によれば、この問題は、未知拡張データをストリームリーダにスキッ
プさせ、可能ならば、破棄させることによって解決している。具体的には、スト
リームライタは、以下で詳しく説明するように、クラス拡張が書かれるときのフ
ォーマットを制御するように改良されている。
クラスをストリーム上に見つけたとき発生している。具体的には、未知バージョ
ンは、既知クラスには未知エクステンションとして見えるのが一般的である。本
発明の原理によれば、この問題は、未知拡張データをストリームリーダにスキッ
プさせ、可能ならば、破棄させることによって解決している。具体的には、スト
リームライタは、以下で詳しく説明するように、クラス拡張が書かれるときのフ
ォーマットを制御するように改良されている。
【0048】 具体的に説明すると、オリジナル基底クラスデータのフォーマットは、以下に
ストリームアウト演算子の例で示すように、バージョン番号を書き、基底クラス
データをストリーム化し、そのあと派生クラスデータをストリーム化するように
なっている。
ストリームアウト演算子の例で示すように、バージョン番号を書き、基底クラス
データをストリーム化し、そのあと派生クラスデータをストリーム化するように
なっている。
【0049】
【数9】
【0050】 ストリームイン演算子のフォーマットは次の通りである。
【0051】
【数10】
【0052】 さらに、将来バージョンのクラスは、その拡張フィールドをグループに追加し
なければならない。ストリームライタは、このグループの前にグループの長さを
置くように改良されている。このようにすると、クラス情報は図3に示すシーケ
ンスで読み書きされることになる。
なければならない。ストリームライタは、このグループの前にグループの長さを
置くように改良されている。このようにすると、クラス情報は図3に示すシーケ
ンスで読み書きされることになる。
【0053】 図3は、矢印316で示す順序で読み書きされるN個のエクステンションをも つクラスを示している。クラス情報がストリームに書かれるとき、バージョン番
号300が最初に書かれ、そのあとに拡張フィールドのグループが続いている。
各フィールドグループは、その前にグループの長さが置かれている。例えば、拡
張フィールドグループ304は、その前にグループ長さ302が置かれている。
グループ308はその前に長さ306が、グループ312はその前に長さ310
が置かれている等である。以下、同様である。オリジナルクラスフィールド31
4は最後に書かれる。非斜体のフィールドは、オブジェクト自体によって指定ま
たはストリームに書かれるデータを示すのに対して、斜体のフィールドは、本発
明の原理に従って作られたストリーミングサポートコードによってストリームに
書かれるデータを示している。「最新」のエクステンションが最初に書かれ、「
古い」エクステンションがその後に続いていることに注意されたい。以下は、2
つのバージョン拡張をもつクラスのストリームアウト演算子の例である。
号300が最初に書かれ、そのあとに拡張フィールドのグループが続いている。
各フィールドグループは、その前にグループの長さが置かれている。例えば、拡
張フィールドグループ304は、その前にグループ長さ302が置かれている。
グループ308はその前に長さ306が、グループ312はその前に長さ310
が置かれている等である。以下、同様である。オリジナルクラスフィールド31
4は最後に書かれる。非斜体のフィールドは、オブジェクト自体によって指定ま
たはストリームに書かれるデータを示すのに対して、斜体のフィールドは、本発
明の原理に従って作られたストリーミングサポートコードによってストリームに
書かれるデータを示している。「最新」のエクステンションが最初に書かれ、「
古い」エクステンションがその後に続いていることに注意されたい。以下は、2
つのバージョン拡張をもつクラスのストリームアウト演算子の例である。
【0054】
【数11】
【0055】 対応するストリームイン演算子は次の通りである。
【0056】
【数12】
【0057】 ストリームを読み取るとき、以前のフレームワークバージョンでは、バージョ
ン番号を読み取ったあとで、その長さを使用して、そのバージョンが理解するエ
クステンションに到達するまで拡張フィールドをスキップしている。スキップし
たエクステンションを廃棄することも、それらを「ビットバケット(bit bucket)
」と呼ばれる一時記憶域に格納しておき、クラスをストリームアウトするときに
使用できるようにもなっている。これについては、以下で説明する。
ン番号を読み取ったあとで、その長さを使用して、そのバージョンが理解するエ
クステンションに到達するまで拡張フィールドをスキップしている。スキップし
たエクステンションを廃棄することも、それらを「ビットバケット(bit bucket)
」と呼ばれる一時記憶域に格納しておき、クラスをストリームアウトするときに
使用できるようにもなっている。これについては、以下で説明する。
【0058】 このアプローチの欠点の1つは、ストリームライタが各エクステンションを書
く前に拡張グループの長さを予測できないことである。ランダムアクセスストリ
ームでは、このことは、システムがバックアップし、長さを書いた後で、リセッ
トする必要があることを意味する。このためには、データがバッファ境界にまた
がる場合、ファイルバッファを何度もフラッシュ(flush)する必要がある。非 ランダムアクセスストリームでは、このことは、システムが拡張データをインメ
モリ (in-memory) ストリームに書いた後で、長さを書き、インメモリストリー ムをメインストリームにコピーする必要があることを意味する。これは、パフォ
ーマンスとメモリに重大な影響を与えることになる。この影響を軽減するために
、下述する互換性サポートは、それが絶対に必要であるときだけエクステンショ
ンをラップ (wrap) するだけである。ストリームが持続的でなければ、エクステ
ンションラッピングコード (extension-wrapping code) はなにもしない。
く前に拡張グループの長さを予測できないことである。ランダムアクセスストリ
ームでは、このことは、システムがバックアップし、長さを書いた後で、リセッ
トする必要があることを意味する。このためには、データがバッファ境界にまた
がる場合、ファイルバッファを何度もフラッシュ(flush)する必要がある。非 ランダムアクセスストリームでは、このことは、システムが拡張データをインメ
モリ (in-memory) ストリームに書いた後で、長さを書き、インメモリストリー ムをメインストリームにコピーする必要があることを意味する。これは、パフォ
ーマンスとメモリに重大な影響を与えることになる。この影響を軽減するために
、下述する互換性サポートは、それが絶対に必要であるときだけエクステンショ
ンをラップ (wrap) するだけである。ストリームが持続的でなければ、エクステ
ンションラッピングコード (extension-wrapping code) はなにもしない。
【0059】 2. 欠落クラス 欠落クラス(missing class) のデータ互換性の問題は、ストリームリーダが未
知のクラスをストリーム上に見つけたとき発生している。場合によっては、スト
リームライタは、前述したCommonpointシステムの場合と同じように、ストリー ム化オブジェクトの終わりを通知しないことがある。従って、ストリームリーダ
は未知のオブジェクトをスキップできず、未知のクラスを含んでいるストリーム
は、そのクラスから以降読み取り不能になっている。
知のクラスをストリーム上に見つけたとき発生している。場合によっては、スト
リームライタは、前述したCommonpointシステムの場合と同じように、ストリー ム化オブジェクトの終わりを通知しないことがある。従って、ストリームリーダ
は未知のオブジェクトをスキップできず、未知のクラスを含んでいるストリーム
は、そのクラスから以降読み取り不能になっている。
【0060】 このことは、前方と後方の両データ互換性の問題となっている。明らかなよう
に、新しいフレームワークバージョンからのストリーム上に未知のクラスが見つ
かることがあるのは、より新しいフレームワークバージョンが新しいクラスを含
んでいるためである。しかし、新フレームワークバージョンは、旧クラスのいく
つかが削除されていると、旧フレームワークバージョンからのストリーム上のク
ラスのいくつかを認識できないことが起こる。後者の問題を回避するために、持
続的クラスは旧フレームワークバージョンから削除されていない。
に、新しいフレームワークバージョンからのストリーム上に未知のクラスが見つ
かることがあるのは、より新しいフレームワークバージョンが新しいクラスを含
んでいるためである。しかし、新フレームワークバージョンは、旧クラスのいく
つかが削除されていると、旧フレームワークバージョンからのストリーム上のク
ラスのいくつかを認識できないことが起こる。後者の問題を回避するために、持
続的クラスは旧フレームワークバージョンから削除されていない。
【0061】 新クラスにもなお問題があるが、幸いにも、すべての新クラスが問題を引き起
こす潜在性をもっているわけではない。問題は、新クラスが既存クラスから派生
しているときと、これらの新クラスが多態的にストリーム化されているときにだ
け起こっている。例えば、旧フレームワークバージョンにTTextStyleと呼ばれる
テキストスタイルがあり、新フレークワークバージョンがTTextStyleから派生し
ている、新しいテキストスタイルTWavyUnderlineStyleを取り入れたとする。新 フレームワークでは、TWavyUnderlineStyleは新クラスによって多態的にストリ ーム化するか、旧クラスの新エクステンションによって多態的にストリーム化す
るかのいずれかが可能である。しかし、TWavyUnderlineStyleは旧フレームワー クバージョンに存在しないので、旧クラスの基底バージョンで多態的にストリー
ム化することはできない。TWavyUnderlineStyleは旧クラスの基底バージョンで ストリーム化できないので、また、これは旧フレームワークのストリーミング関
数によって読み取られる唯一のバージョンであるので、どの旧フレームワークに
も、多態的TWavyUnderlineStyleが現れることはない。そのため、欠落クラス問 題は、多態的にストリーム化されたクラスでは起こることがない。
こす潜在性をもっているわけではない。問題は、新クラスが既存クラスから派生
しているときと、これらの新クラスが多態的にストリーム化されているときにだ
け起こっている。例えば、旧フレームワークバージョンにTTextStyleと呼ばれる
テキストスタイルがあり、新フレークワークバージョンがTTextStyleから派生し
ている、新しいテキストスタイルTWavyUnderlineStyleを取り入れたとする。新 フレームワークでは、TWavyUnderlineStyleは新クラスによって多態的にストリ ーム化するか、旧クラスの新エクステンションによって多態的にストリーム化す
るかのいずれかが可能である。しかし、TWavyUnderlineStyleは旧フレームワー クバージョンに存在しないので、旧クラスの基底バージョンで多態的にストリー
ム化することはできない。TWavyUnderlineStyleは旧クラスの基底バージョンで ストリーム化できないので、また、これは旧フレームワークのストリーミング関
数によって読み取られる唯一のバージョンであるので、どの旧フレームワークに
も、多態的TWavyUnderlineStyleが現れることはない。そのため、欠落クラス問 題は、多態的にストリーム化されたクラスでは起こることがない。
【0062】 しかし、旧フレームワークリーダは、多態的にストリーム化されたTWavyUnder
lineStyleに出会うことがある。例えば、テキストスタイルを多態的にストリー ム化する、TStyleBundleと名付けられた旧クラスがあるとする。新フレームワー
クでは、TStyleBundleクラスはTWavyUnderlineStyleを含んでいる場合がある。T
WavyUnderlineStyleを含んでいるTStyleBundleが新フレームワークで作られたア
プリケーションプログラムによってストリーム化され、そのストリームが旧フレ
ームワークで作られたアプリケーションによって読み取られるとすると、TStyle
Bundleクラスのストリームイン演算子は旧TTextStyleを復元しようとする。旧TT
extStyleはTWavyUnderlineStyleによって置き換えられているので、この復元は 失敗することになる。
lineStyleに出会うことがある。例えば、テキストスタイルを多態的にストリー ム化する、TStyleBundleと名付けられた旧クラスがあるとする。新フレームワー
クでは、TStyleBundleクラスはTWavyUnderlineStyleを含んでいる場合がある。T
WavyUnderlineStyleを含んでいるTStyleBundleが新フレームワークで作られたア
プリケーションプログラムによってストリーム化され、そのストリームが旧フレ
ームワークで作られたアプリケーションによって読み取られるとすると、TStyle
Bundleクラスのストリームイン演算子は旧TTextStyleを復元しようとする。旧TT
extStyleはTWavyUnderlineStyleによって置き換えられているので、この復元は 失敗することになる。
【0063】 本発明の原理によれば、ストリームライタは、既存クラスから派生している、
すべての新クラスがストリーム化されるとき「代替(alternate)」旧クラスを書 くように改良されている。代替クラスの各々は、オリジナルクラスを含めて、先
頭に置かれている長さのエクステンションと同じようにラップされる。このよう
にすると、クラス情報は図4に示すシーケンスで読み書きされることになる。
すべての新クラスがストリーム化されるとき「代替(alternate)」旧クラスを書 くように改良されている。代替クラスの各々は、オリジナルクラスを含めて、先
頭に置かれている長さのエクステンションと同じようにラップされる。このよう
にすると、クラス情報は図4に示すシーケンスで読み書きされることになる。
【0064】 図4は、矢印416で示す順序で読み書きされる代替をもつクラスを示してい
る。クラス情報がストリームに書かれるとき、開始代替名400が最初に書かれ
る。この開始代替はオリジナルクラス情報である。各代替の情報はその前に代替
の長さが置かれている。例えば、開始代替400の長さ402はその代替の情報
の前に置かれている。タイプ情報404が次に書かれ、代替バージョン番号40
6が次に書かれ、その後に代替フィールドのグループ408が続いている。
る。クラス情報がストリームに書かれるとき、開始代替名400が最初に書かれ
る。この開始代替はオリジナルクラス情報である。各代替の情報はその前に代替
の長さが置かれている。例えば、開始代替400の長さ402はその代替の情報
の前に置かれている。タイプ情報404が次に書かれ、代替バージョン番号40
6が次に書かれ、その後に代替フィールドのグループ408が続いている。
【0065】 同じように、次の代替410は名前410とその後に続く長さ412、タイプ
情報414およびフィールドのグループ418からなっている。非斜体のフィー
ルドは、オブジェクト自体によって指定またはストリームに書かれるデータを示
すのに対して、斜体のフィールドは、本発明の原理に従って作られたストリーミ
ングサポートコードによってストリームに書かれるデータを示している。エクス
テンションの場合と同様に、「最新」代替が最初に書かれ、その後に「古い」代
替が続いている。その後、最初の代替を理解しないストリームリーダは長さを使
用して、それをスキップすることができる。その後、それらは、理解する代替に
到達するまで後続の代替を読んでいくことができる。スキップした代替は破棄す
るか、ビットバケットに格納できる。ストリームリーダが代替のどれも理解しな
いときは、本発明によるResurrect()関数はすべての代替をスキップし、例外を スローする。この例外をキャッチできるアプリケーションプログラムは、そのま
ま続けてストリームの残り部分を読み取ることができる。
情報414およびフィールドのグループ418からなっている。非斜体のフィー
ルドは、オブジェクト自体によって指定またはストリームに書かれるデータを示
すのに対して、斜体のフィールドは、本発明の原理に従って作られたストリーミ
ングサポートコードによってストリームに書かれるデータを示している。エクス
テンションの場合と同様に、「最新」代替が最初に書かれ、その後に「古い」代
替が続いている。その後、最初の代替を理解しないストリームリーダは長さを使
用して、それをスキップすることができる。その後、それらは、理解する代替に
到達するまで後続の代替を読んでいくことができる。スキップした代替は破棄す
るか、ビットバケットに格納できる。ストリームリーダが代替のどれも理解しな
いときは、本発明によるResurrect()関数はすべての代替をスキップし、例外を スローする。この例外をキャッチできるアプリケーションプログラムは、そのま
ま続けてストリームの残り部分を読み取ることができる。
【0066】 代替をもつクラスのストリームインとストリームアウトの演算子を示すコード
の断片の例は次の通りである。
の断片の例は次の通りである。
【0067】
【数13】
【0068】 この解決方法の1つの欠点は、代替がストリーミング演算子をスローダウンさ
せ、ストリームのサイズを大きくすることである。代替クラスを構築し、初期化
し、ストリーム化する必要があるのでストリームを書く時間が長くなり、また代
替データを含んでいるためストリームが大きくなっている。このコストを軽減す
るために、以下に開示されている互換性サポートコードは、それが絶対に必要な
場合に代替データを書くだけにしている。オブジェクトが持続的でなければ、あ
るいはオブジェクトが多態的にストリーム化されるのでなければ、その時代替デ
ータは書かれないようになっている。
せ、ストリームのサイズを大きくすることである。代替クラスを構築し、初期化
し、ストリーム化する必要があるのでストリームを書く時間が長くなり、また代
替データを含んでいるためストリームが大きくなっている。このコストを軽減す
るために、以下に開示されている互換性サポートコードは、それが絶対に必要な
場合に代替データを書くだけにしている。オブジェクトが持続的でなければ、あ
るいはオブジェクトが多態的にストリーム化されるのでなければ、その時代替デ
ータは書かれないようになっている。
【0069】 代替を使用するストリーミング演算子の形式は次の通りである。
【0070】
【数14】
【0071】 事情によっては、特定のアプリケーションプログラムがクラスの代替を補足ま
たはオーバライドすることが望ましいことがある。この場合、これを行うために
FlattenWithoutAlternates()関数が使用される。FlattenWithoutAlternates()は
、その代替のいずれもなしで与えられたオブジェクトをストリーム上に置く。以
下のコードの断片は、FlattenWithoutAlternates()をアプリケーションでどのよ
うな使い方をすると、オブジェクトのデフォルト代替をオーバライドし、特殊な
代替ストリームを与えることができるかを示している。この例では、アプリケー
ションは、MGgraphicと名付けたタイプのオブジェクトをストリーム化すること を望み、独自の代替オブジェクトを与えることを望んでいるものと想定している
。
たはオーバライドすることが望ましいことがある。この場合、これを行うために
FlattenWithoutAlternates()関数が使用される。FlattenWithoutAlternates()は
、その代替のいずれもなしで与えられたオブジェクトをストリーム上に置く。以
下のコードの断片は、FlattenWithoutAlternates()をアプリケーションでどのよ
うな使い方をすると、オブジェクトのデフォルト代替をオーバライドし、特殊な
代替ストリームを与えることができるかを示している。この例では、アプリケー
ションは、MGgraphicと名付けたタイプのオブジェクトをストリーム化すること を望み、独自の代替オブジェクトを与えることを望んでいるものと想定している
。
【0072】
【数15】
【0073】 3. データ損失の防止 前述したデータ互換性サポートを使用すると、ストリームリーダに、それらが
理解しないストリーム化エクステンションと代替をスキップさせることができる
。その結果、ストリームがサイト間でやりとりされるときデータ損失が起こる可
能性がある。例えば、ユーザ1とユーザ2が拡張グラフィックオブジェクトを含
んでいるドキュメントで共同作業しているとする。このオブジェクトは多角形 (
polygon) であるが、新フレームワークでは、曲線を含むように拡張されている 。ユーザ1は新フレームワークで作られたアプリケーションプログラムを使用し
ているが、ユーザ2は旧フレームワークバージョンで作られたプログラムを使用
している。ユーザ1はオブジェクトを編集し、曲線編集を導入してから、そのオ
ブジェクトをストリーム化してユーザ2に渡している。ユーザ2の旧ストリーム
リーダは未知の曲線データを破棄し、多角形をユーザ2に提示している。ユーザ
2は多角形を編集し、その多角形をストリーム化してユーザ1に送り返すが、ユ
ーザ1の曲線編集は紛失している。この種のデータ損失を防止するために、本発
明によるシステムは、未読み取りストリームデータをキャプチャし、保存してお
くために使用できる「ビットバケット」クラスを用意している。
理解しないストリーム化エクステンションと代替をスキップさせることができる
。その結果、ストリームがサイト間でやりとりされるときデータ損失が起こる可
能性がある。例えば、ユーザ1とユーザ2が拡張グラフィックオブジェクトを含
んでいるドキュメントで共同作業しているとする。このオブジェクトは多角形 (
polygon) であるが、新フレームワークでは、曲線を含むように拡張されている 。ユーザ1は新フレームワークで作られたアプリケーションプログラムを使用し
ているが、ユーザ2は旧フレームワークバージョンで作られたプログラムを使用
している。ユーザ1はオブジェクトを編集し、曲線編集を導入してから、そのオ
ブジェクトをストリーム化してユーザ2に渡している。ユーザ2の旧ストリーム
リーダは未知の曲線データを破棄し、多角形をユーザ2に提示している。ユーザ
2は多角形を編集し、その多角形をストリーム化してユーザ1に送り返すが、ユ
ーザ1の曲線編集は紛失している。この種のデータ損失を防止するために、本発
明によるシステムは、未読み取りストリームデータをキャプチャし、保存してお
くために使用できる「ビットバケット」クラスを用意している。
【0074】 未読み取り拡張データを保存しておくために、本発明によるシステムはTExten
sionBitBucketクラスを用意している。使用時には、TExtensionBitBucketオブジ
ェクトが上述したReadVersion()関数に渡されると、スキップしたエクステンシ ョンは破棄されるのではなく、そのオブジェクトに入れられる。情報はその後一
時的に格納される。TExtensionBitBucketオブジェクトはWriteVersion()関数に 渡すことも可能であり、格納されたコンテンツがストリームに書かれることにな
る。しかし、アプリケーションプログラムは、格納情報をストリームに書くかど
うかを判断しなければならない。ベースオブジェクトが変更されていなければ、
その時格納情報を書き出しても安全であることは明らかである。しかし、ベース
オブジェクトが変更されていたときは、格納情報は新オブジェクトと矛盾してい
るおそれがある。格納情報を書き出すかどうかを、クライアントが判断しやすく
するために、TExtensionBitBucketオブジェクトは「直交(orthogonal)」フラグ を保存している。このフラグは、オブジェクトに入っている格納データが、ベー
スデータの影響を受けているか、それともベースデータとは無関係(直交)であ
るかを示している。フラグがTRUEであれば、格納データは、ベースオブジェクト
がどのように変更されたかに関係なく、ベースオブジェクトとの整合性が保たれ
ている。
sionBitBucketクラスを用意している。使用時には、TExtensionBitBucketオブジ
ェクトが上述したReadVersion()関数に渡されると、スキップしたエクステンシ ョンは破棄されるのではなく、そのオブジェクトに入れられる。情報はその後一
時的に格納される。TExtensionBitBucketオブジェクトはWriteVersion()関数に 渡すことも可能であり、格納されたコンテンツがストリームに書かれることにな
る。しかし、アプリケーションプログラムは、格納情報をストリームに書くかど
うかを判断しなければならない。ベースオブジェクトが変更されていなければ、
その時格納情報を書き出しても安全であることは明らかである。しかし、ベース
オブジェクトが変更されていたときは、格納情報は新オブジェクトと矛盾してい
るおそれがある。格納情報を書き出すかどうかを、クライアントが判断しやすく
するために、TExtensionBitBucketオブジェクトは「直交(orthogonal)」フラグ を保存している。このフラグは、オブジェクトに入っている格納データが、ベー
スデータの影響を受けているか、それともベースデータとは無関係(直交)であ
るかを示している。フラグがTRUEであれば、格納データは、ベースオブジェクト
がどのように変更されたかに関係なく、ベースオブジェクトとの整合性が保たれ
ている。
【0075】 BitBucketオブジェクトは上記の例で使用することができる。新フレームワー クの開発者が、多角形クラスが将来拡張されるのではないかと思っているときは
、多角形クラスがストリーム化される個所にTExtensionBitBucketクラスを組み 入れておくことができる。その結果のBitBucketオブジェクトはクラスの将来の 拡張をキャッチすることになる。多角形オブジェクトが曲線を含むように拡張さ
れるときは、多角形のストリーミング演算子も、曲線を読み書きするように拡張
される。多角形クラスのストリームアウト演算子では、開発者は、曲線データが
多角形データに直交することを示すフラグをセットする。
、多角形クラスがストリーム化される個所にTExtensionBitBucketクラスを組み 入れておくことができる。その結果のBitBucketオブジェクトはクラスの将来の 拡張をキャッチすることになる。多角形オブジェクトが曲線を含むように拡張さ
れるときは、多角形のストリーミング演算子も、曲線を読み書きするように拡張
される。多角形クラスのストリームアウト演算子では、開発者は、曲線データが
多角形データに直交することを示すフラグをセットする。
【0076】 そのため、ここでは、ユーザ1が多角形をストリーム化してユーザ2に送ると
き、エクストラ曲線データは破棄されない。その代わりに、改良コードはそれを
ビットバケットに格納する。ユーザ2は多角形を編集した後、それをユーザ1に
送り返す。ユーザ2が多角形データをストリーム化するとき、直交フラグがTRUE
にセットされているのでストリームライタも格納データをストリーム化する。そ
のあと、編集された曲線データが、ユーザ2によって編集された多角形データと
一緒にユーザ1に送り返され、両ユーザの作業は維持される。
き、エクストラ曲線データは破棄されない。その代わりに、改良コードはそれを
ビットバケットに格納する。ユーザ2は多角形を編集した後、それをユーザ1に
送り返す。ユーザ2が多角形データをストリーム化するとき、直交フラグがTRUE
にセットされているのでストリームライタも格納データをストリーム化する。そ
のあと、編集された曲線データが、ユーザ2によって編集された多角形データと
一緒にユーザ1に送り返され、両ユーザの作業は維持される。
【0077】 未読み取り代替クラスデータを保存しておくために、本発明によるシステムは
TAlternateBitBucketクラスを用意している。使用時には、アプリケーションプ ログラムはTAlternateBitBucketオブジェクトをResurrect()関数に渡すことがで
き、未読み取り代替データのすべてがそこにダンプされることになる。アプリケ
ーションプログラムはTAlternateBitBucketオブジェクトをFlatten()関数に渡す
こともでき、フラット化クラスをもつ代替データが書き出されることになる。
TAlternateBitBucketクラスを用意している。使用時には、アプリケーションプ ログラムはTAlternateBitBucketオブジェクトをResurrect()関数に渡すことがで
き、未読み取り代替データのすべてがそこにダンプされることになる。アプリケ
ーションプログラムはTAlternateBitBucketオブジェクトをFlatten()関数に渡す
こともでき、フラット化クラスをもつ代替データが書き出されることになる。
【0078】 TAlternateBitBucketクラスの使い方は、TExtensionBitBucketクラスのそれと
同じである。しかし、デフォルト代替の使用は、共同作業のシナリオが複雑であ
るため困難である。代替オブジェクトに対する編集はすべてのシステムが知って
いるとは限らないので、困難な問題が発生する。
同じである。しかし、デフォルト代替の使用は、共同作業のシナリオが複雑であ
るため困難である。代替オブジェクトに対する編集はすべてのシステムが知って
いるとは限らないので、困難な問題が発生する。
【0079】 一実施例によれば、データ互換性システムは、従来のCommonpointストリーミ ングアーキテクチャをいくつか拡張したものから構成されている。データ互換性
システムは、ストリームラッパ (stream wrapper)、ビットバケットおよび強化 されたストリーミングサポート関数を取り入れることによってストリーミングア
ーキテクチャを拡張している。ストリームラッパクラスのいくつかはパブリック
であり、開発者が利用できるようになっている。その他はプライベートであり、
種々の内部関数を実行するために使用される。
システムは、ストリームラッパ (stream wrapper)、ビットバケットおよび強化 されたストリーミングサポート関数を取り入れることによってストリーミングア
ーキテクチャを拡張している。ストリームラッパクラスのいくつかはパブリック
であり、開発者が利用できるようになっている。その他はプライベートであり、
種々の内部関数を実行するために使用される。
【0080】 TAlternateInputStream、TAlternateOutputStream、TExtensionInputStreamお
よびTExtensionOutputStreamを含む、いくつかのストリームラッパクラスの機能
は、ストリームをラップし、ストリーム化データをフィルタリングすることであ
る。例えば、TExtensionOutputStreamは、すべてのクラス拡張フィールドグルー
プの前に、ストリーム上でその長さが置かれているかを確かめ、TAlternateInpu
tStreamは必要でない代替を破棄する。これらのクラスは、データ互換性をサポ ートするために使用されることを目的としているので開発者が利用できる。パブ
リックおよびプライベートストリーミングクラスの完全なクラス階層は図5と図
6に示されている。
よびTExtensionOutputStreamを含む、いくつかのストリームラッパクラスの機能
は、ストリームをラップし、ストリーム化データをフィルタリングすることであ
る。例えば、TExtensionOutputStreamは、すべてのクラス拡張フィールドグルー
プの前に、ストリーム上でその長さが置かれているかを確かめ、TAlternateInpu
tStreamは必要でない代替を破棄する。これらのクラスは、データ互換性をサポ ートするために使用されることを目的としているので開発者が利用できる。パブ
リックおよびプライベートストリーミングクラスの完全なクラス階層は図5と図
6に示されている。
【0081】 図5と図6は一連のいわゆるBoochクラス図で、種々の異なるフレームワーク を形成するクラスを示している。クラスの各々とクラス間の関係は以下で詳しく
説明する。Booch図とそこで使用されている表記はこの分野では周知であり、こ こで説明することは省略する。Booch図と表記の意味については、Grady Booch著
「アプリケーションに関するオブジェクト指向分析と設計」という書名でBenjam
in/Cummings Publishing Company, Incから出版されているテキストブックで解 説されているが、その内容は引用により本明細書に記載されている。
説明する。Booch図とそこで使用されている表記はこの分野では周知であり、こ こで説明することは省略する。Booch図と表記の意味については、Grady Booch著
「アプリケーションに関するオブジェクト指向分析と設計」という書名でBenjam
in/Cummings Publishing Company, Incから出版されているテキストブックで解 説されているが、その内容は引用により本明細書に記載されている。
【0082】 パブリックストリームラッパクラス 図5を参照すると、TDelegatingStreamクラス502は、抽象クラスTStream5
00から派生し、別のストリームにデリゲート (delegate) する抽象ストリーム
クラスである。これは、すべてのストリームコールを目的ストリームに引き渡す
。これのクラス宣言は次のようになっている。
00から派生し、別のストリームにデリゲート (delegate) する抽象ストリーム
クラスである。これは、すべてのストリームコールを目的ストリームに引き渡す
。これのクラス宣言は次のようになっている。
【0083】
【数16】
【0084】 TAlternateInputStreamクラス508は、代替を読み取るためのデリゲートス トリーム (delegating stream) を定義している。これはResurrect()関数とタン
デムで働き、代替を収めているストリームを読み取る。これは最初の既知代替を
戻し、その他はすべて破棄する。TAlternateInputStreamクラス508はサブク ラス化されることを目的としていない。その宣言は次の通りである。
デムで働き、代替を収めているストリームを読み取る。これは最初の既知代替を
戻し、その他はすべて破棄する。TAlternateInputStreamクラス508はサブク ラス化されることを目的としていない。その宣言は次の通りである。
【0085】
【数17】
【0086】 TAlternateOutputStreamクラス510は代替をストリームアウトするための指
名ストリーム (designating stream) を定義している。これは、ストリームが代
替を要求しているかどうかを判断するために使用できるPrepareForNextAlternat
e()メソッドをサポートしている。TAlternateOutputStreamクラス510はサブ クラス化されることを目的としていない。その宣言は次の通りである。
名ストリーム (designating stream) を定義している。これは、ストリームが代
替を要求しているかどうかを判断するために使用できるPrepareForNextAlternat
e()メソッドをサポートしている。TAlternateOutputStreamクラス510はサブ クラス化されることを目的としていない。その宣言は次の通りである。
【0087】
【数18】
【0088】 TBufferSupportStreamクラス504は、バッファ付き入出力ストリームをサポ
ートする抽象ストリームラッパである。これは、ラップされるストリームをNIL 、ランダムアクセスによる非持続的または順次アクセスによる持続的であるもの
として分類している。その宣言は次の通りである。
ートする抽象ストリームラッパである。これは、ラップされるストリームをNIL 、ランダムアクセスによる非持続的または順次アクセスによる持続的であるもの
として分類している。その宣言は次の通りである。
【0089】
【数19】
【0090】 TBufferSupportStreamクラス504から派生したクラスは図6に示されている
。TBufferInputStreamクラス602は、そのデータをバッファに入れる入力スト
リームを実行する。これは、ストリーム化データをストリームから直接に読み取
るのではなく、それを仮想バッファにストアしておくデリゲートストリームであ
る。TBufferInputStreamクラスは、バッファされたデータに関する統計を収めて
いるストリームヘッダオブジェクトを受け取る。ラップされたデータをストリー
ムから読み取るとき、最初にヘッダデータをストリームから読み取ってから、バ
ッファされたデータを読み取る。TBufferInputStreamクラス602は、ラップさ
れたデータをストリームから読み取ることなく、それをスキップするメソッドも
提供している。その宣言は次の通りである。
。TBufferInputStreamクラス602は、そのデータをバッファに入れる入力スト
リームを実行する。これは、ストリーム化データをストリームから直接に読み取
るのではなく、それを仮想バッファにストアしておくデリゲートストリームであ
る。TBufferInputStreamクラスは、バッファされたデータに関する統計を収めて
いるストリームヘッダオブジェクトを受け取る。ラップされたデータをストリー
ムから読み取るとき、最初にヘッダデータをストリームから読み取ってから、バ
ッファされたデータを読み取る。TBufferInputStreamクラス602は、ラップさ
れたデータをストリームから読み取ることなく、それをスキップするメソッドも
提供している。その宣言は次の通りである。
【0091】
【数20】
【0092】 TBufferOutputStreamクラス604は、そのデータをバッファに入れる出力ス トリームを実行する。これは、ストリーム化データをストリームに直接に書き出
すのではなく、それを仮想バッファにストアしておくデリゲートストリームであ
る。TBufferOutputStreamクラス604は、バッファされたデータに関する統計 を収めているストリームヘッダオブジェクトを受け取る。ラップされたデータを
ストリームに書くとき、最初にヘッダをストリーム化してから、バッファされた
データをストリーム化する。TBufferOutputStreamクラス604は、ラップされ たデータをストリームに書くことなく、それをダンプするメソッドも提供してい
る。その宣言は次の通りである。
すのではなく、それを仮想バッファにストアしておくデリゲートストリームであ
る。TBufferOutputStreamクラス604は、バッファされたデータに関する統計 を収めているストリームヘッダオブジェクトを受け取る。ラップされたデータを
ストリームに書くとき、最初にヘッダをストリーム化してから、バッファされた
データをストリーム化する。TBufferOutputStreamクラス604は、ラップされ たデータをストリームに書くことなく、それをダンプするメソッドも提供してい
る。その宣言は次の通りである。
【0093】
【数21】
【0094】 TExtensionInputStreamクラス608は、エクステンションをストリームイン するためのバッファ付き入力ストリームを定義している。これは、エクステンシ
ョンが以前のデータに直交しているかどうかを知らせるIsOrthogonal()メソッド
をサポートしている。その宣言は次の通りである。
ョンが以前のデータに直交しているかどうかを知らせるIsOrthogonal()メソッド
をサポートしている。その宣言は次の通りである。
【0095】
【数22】
【0096】 TExtensionOutputStreamクラス612は、エクステンションを書き出すための
バッファ付き出力ストリームを定義している。その宣言は次の通りである。
バッファ付き出力ストリームを定義している。その宣言は次の通りである。
【0097】
【数23】
【0098】 パブリックビットバケットクラス データ互換性サポートコードは、未読み取りストリームデータを保存するため
に使用できるビットバケットクラスも含んでいる。アプリケーションはビットバ
ケットオブジェクトをReadVersion()関数とResurrect()関数に渡し、スキップさ
れたエクステンションと代替をキャプチャし、アプリケーションは満杯ビットバ
ケットをWriteVersion()関数とFlatten()関数に渡し、格納データをストリーム 化する。
に使用できるビットバケットクラスも含んでいる。アプリケーションはビットバ
ケットオブジェクトをReadVersion()関数とResurrect()関数に渡し、スキップさ
れたエクステンションと代替をキャプチャし、アプリケーションは満杯ビットバ
ケットをWriteVersion()関数とFlatten()関数に渡し、格納データをストリーム 化する。
【0099】 ビットバケットクラスには、TAlternateBitBucketとTExtensionBitBucketの2
つがあり、どちらもルートをもっていない(別のクラスからも派生していない)
。これらの実行はパブリックでない。TAlternateBitBucketクラスは未読み取り 代替をキャプチャするオブジェクトを構築する。アプリケーションは、TAlterna
teBitBucketオブジェクトをResurrect()関数に渡すことができ、Resurrect()関 数はスキップした代替のすべてをそこに入れる。アプリケーションはTAlternate
BitBucketオブジェクトをFlatten()関数に渡し、フラット化オブジェクトの正規
代替ではなく、格納された代替をストリーム化することもできる。TAlternateBi
tBucketオブジェクトは代替の順序を保存しておくので、代替は、読み取られた ときと同じ順序で書き出すことができる。TAlternateBitBucketクラスはサブク ラス化されることを目的としていない。その宣言は次の通りである。
つがあり、どちらもルートをもっていない(別のクラスからも派生していない)
。これらの実行はパブリックでない。TAlternateBitBucketクラスは未読み取り 代替をキャプチャするオブジェクトを構築する。アプリケーションは、TAlterna
teBitBucketオブジェクトをResurrect()関数に渡すことができ、Resurrect()関 数はスキップした代替のすべてをそこに入れる。アプリケーションはTAlternate
BitBucketオブジェクトをFlatten()関数に渡し、フラット化オブジェクトの正規
代替ではなく、格納された代替をストリーム化することもできる。TAlternateBi
tBucketオブジェクトは代替の順序を保存しておくので、代替は、読み取られた ときと同じ順序で書き出すことができる。TAlternateBitBucketクラスはサブク ラス化されることを目的としていない。その宣言は次の通りである。
【0100】
【数24】
【0101】 TExtensionBitBucketクラスは、未読み取りエクステンションをキャプチャす るオブジェクトを構築する。アプリケーションはTExtensionBitBucketオブジェ クトをReadVersion()関数に渡すことができ、ReadVersion()関数はスキップされ
たエクステンションのすべてをオブジェクトに入れる。アプリケーションは満杯
TExtensionBitBucketオブジェクトをWriteVersion()関数に渡すこともでき、Wri
teVersion()関数は格納エクステンションをストリーム化する。TExtensionBitBu
cketオブジェクトは、そこに収められた拡張データが、そのクラスの他のストリ
ームデータと無関係であるかどうかを示すフラグを保存している。TExtensionBi
tBucketクラスはサブクラス化されることを目的としていない。これは次のよう に定義されている。
たエクステンションのすべてをオブジェクトに入れる。アプリケーションは満杯
TExtensionBitBucketオブジェクトをWriteVersion()関数に渡すこともでき、Wri
teVersion()関数は格納エクステンションをストリーム化する。TExtensionBitBu
cketオブジェクトは、そこに収められた拡張データが、そのクラスの他のストリ
ームデータと無関係であるかどうかを示すフラグを保存している。TExtensionBi
tBucketクラスはサブクラス化されることを目的としていない。これは次のよう に定義されている。
【0102】
【数25】
【0103】 ストリーミングサポート関数 既存のCommonpointフレームワークは、上述したように、単態 (monomorphic)
および多態 (polymorphic) ストリーミングとストリームフォーマットバージョ ン処理のためのグローバル関数を用意している。本発明によるデータ互換性シス
テムでは、これらの関数は、ビットバケットを受け付け、代替を処理し、他の新
しい互換性機能を取り扱うように拡張されている。
および多態 (polymorphic) ストリーミングとストリームフォーマットバージョ ン処理のためのグローバル関数を用意している。本発明によるデータ互換性シス
テムでは、これらの関数は、ビットバケットを受け付け、代替を処理し、他の新
しい互換性機能を取り扱うように拡張されている。
【0104】 例えば、従来のReadVersion()関数およびWriteVersion()関数は、アプリケー ションがストリームフォーマットバージョン番号を読み書きすることを可能にし
、次のような形式になっている。
、次のような形式になっている。
【0105】
【数26】
【0106】 本発明の原理に従って構築されたデータ互換性システムでは、ReadVersion() 関数とWriteVersion()関数は、エクストラ拡張データを格納し、書き出すための
ビットバケットを処理するように改良されている。これらの新規関数は次のよう
な形式になっている。
ビットバケットを処理するように改良されている。これらの新規関数は次のよう
な形式になっている。
【0107】
【数27】
【0108】 Commonpointフレームワークにおける従来のFlatten()関数とResurrect()関数 は、上述したように多態的ストリーミングを行い、次のような形式になっている
。
。
【0109】
【数28】
【0110】 本発明によるデータ互換性システムでは、代替を格納し、書き出すためのビッ
トバケットを受け付けるバージョンのFlatten()関数とResurrect()関数が追加さ
れている。これらの新バージョンは次のような形式になっている。
トバケットを受け付けるバージョンのFlatten()関数とResurrect()関数が追加さ
れている。これらの新バージョンは次のような形式になっている。
【0111】
【数29】
【0112】 本発明によるデータ互換性システムでは、その代替をもたないオブジェクトを
フラット化するバージョンのFlatten()関数も追加されている。これらのバージ ョンは次のような形式になっている。
フラット化するバージョンのFlatten()関数も追加されている。これらのバージ ョンは次のような形式になっている。
【0113】
【数30】
【0114】 プライベートストリームラッパクラス 本発明によるデータ互換性システムでは、コンテキスト、ストリームおよびス
トリーミングサポート関数を強化し、仮想コンテキスト、ストリームラッパ、ス
トリームラッパヘッダおよびビットバケットを取り入れることによって、ストリ
ーミングアーキテクチャも拡張されている。これらの強化機能の多くは、参照さ
れたオブジェクトがストリームリーダによって認識されないとき、ストリーム上
の参照情報を保存しておくために必要になるものである。
トリーミングサポート関数を強化し、仮想コンテキスト、ストリームラッパ、ス
トリームラッパヘッダおよびビットバケットを取り入れることによって、ストリ
ーミングアーキテクチャも拡張されている。これらの強化機能の多くは、参照さ
れたオブジェクトがストリームリーダによって認識されないとき、ストリーム上
の参照情報を保存しておくために必要になるものである。
【0115】 特に、各ストリームはデフォルトコンテキストをもっている。このコンテキス
トは、ストリーム化オブジェクトへの参照をストアしている。オブジェクトがグ
ローバルストリーミング関数の1つを使用してストリーム化されている時はいつ
でも、ストリーミング関数は、オブジェクトへの参照をストリームのコンテキス
トにストアする。そのオブジェクトがすでにコンテキストにあれば、オブジェク
トを再びストリーミングする代わりに、この関数は、そのオブジェクトの以前に
ストリーム化されたインスタンスへの参照(「エイリアス(alias)」と呼ばれる )を書き出す。
トは、ストリーム化オブジェクトへの参照をストアしている。オブジェクトがグ
ローバルストリーミング関数の1つを使用してストリーム化されている時はいつ
でも、ストリーミング関数は、オブジェクトへの参照をストリームのコンテキス
トにストアする。そのオブジェクトがすでにコンテキストにあれば、オブジェク
トを再びストリーミングする代わりに、この関数は、そのオブジェクトの以前に
ストリーム化されたインスタンスへの参照(「エイリアス(alias)」と呼ばれる )を書き出す。
【0116】 エイリアスは、ストリームのサイズを減少し、ストリームライタが参照情報を
ストリーム内に保存できるようにする。エイリアスのオペレーションは図7Aと 図7Bに示されている。図7Aは、エイリアスなしのストリーミングを示してい る。同図に示すように、AおよびBと名付けた2つのオブジェクト700と70
2は、どちらもCと名付けた同じオブジェクト704を参照している。エイリア
スがないときは、ストリームライタはオブジェクトAをストリーム化し、オブジ
ェクトCがストリーム化され、そのあと、ストリームライタはストリームBをス
トリーム化し、オブジェクトCが矢印706に図示されるように再びストリーム
化されることになる。データストリームの他方の終端では、ストリームリーダは
A'と名付けたオブジェクトコピー708を、次にC'と名付けたオブジェクトコ
ピー712を作り、その2オブジェクト間の参照を作ることになる。その後、リ
ーダはB'と名付けたオブジェクトコピー710を、次にC"と名付けた別のオブ
ジェクトコピー714を作り、参照をセットアップすることになる。最終結果は
、オブジェクト708と710がCの2つの異なるコピーである、オブジェクト
712と714をポイントすることになる。オブジェクト708と710が同じ
オブジェクトをポイントするはずという事実は、失われることになる。
ストリーム内に保存できるようにする。エイリアスのオペレーションは図7Aと 図7Bに示されている。図7Aは、エイリアスなしのストリーミングを示してい る。同図に示すように、AおよびBと名付けた2つのオブジェクト700と70
2は、どちらもCと名付けた同じオブジェクト704を参照している。エイリア
スがないときは、ストリームライタはオブジェクトAをストリーム化し、オブジ
ェクトCがストリーム化され、そのあと、ストリームライタはストリームBをス
トリーム化し、オブジェクトCが矢印706に図示されるように再びストリーム
化されることになる。データストリームの他方の終端では、ストリームリーダは
A'と名付けたオブジェクトコピー708を、次にC'と名付けたオブジェクトコ
ピー712を作り、その2オブジェクト間の参照を作ることになる。その後、リ
ーダはB'と名付けたオブジェクトコピー710を、次にC"と名付けた別のオブ
ジェクトコピー714を作り、参照をセットアップすることになる。最終結果は
、オブジェクト708と710がCの2つの異なるコピーである、オブジェクト
712と714をポイントすることになる。オブジェクト708と710が同じ
オブジェクトをポイントするはずという事実は、失われることになる。
【0117】 図7Bはエイリアス付きのストリーミングを示している。このケースでは、ス トリームライタはAと名付けたオブジェクト716を、次にCと名付けたオブジ ェクト720を、次にBと名付けたオブジェクト718を、次に^Cと名付けた
エイリアスを、以前にストリーム化されたバージョンのCに書き出す。これらの
アイテムは、矢印722で示すデータストリーム上を転送される。データストリ
ームの他方の終端では、ストリームリーダは、A'と名付けたオブジェクトコピ ー724を、次にC'と名付けたオブジェクトコピー728を作り、2オブジェ クト間の参照を作ることになる。その後、リーダはB'と名付けたオブジェクト コピー726を作ることになる。ストリームリーダにエイリアスが現れたとき、
リーダはオブジェクトコピー726を、以前に読み取られたバージョンのオブジ
ェクトC、つまり、オブジェクト728に接続することを知っている。従って、
参照は維持されることになる。
エイリアスを、以前にストリーム化されたバージョンのCに書き出す。これらの
アイテムは、矢印722で示すデータストリーム上を転送される。データストリ
ームの他方の終端では、ストリームリーダは、A'と名付けたオブジェクトコピ ー724を、次にC'と名付けたオブジェクトコピー728を作り、2オブジェ クト間の参照を作ることになる。その後、リーダはB'と名付けたオブジェクト コピー726を作ることになる。ストリームリーダにエイリアスが現れたとき、
リーダはオブジェクトコピー726を、以前に読み取られたバージョンのオブジ
ェクトC、つまり、オブジェクト728に接続することを知っている。従って、
参照は維持されることになる。
【0118】 しかし、エイリアス付きオブジェクト (aliased object) がストリームリーダ
によって認識されないときは、問題が発生する。図7Bに示す上記例では、スト
リームリーダがストリーム化バージョンのオブジェクト720を読まないと、問
題が発生する。このようなことが起こるのは、オブジェクト720がエクステン
ションの一部であったか、リーダによってスキップされた代替であったときであ
る。その場合、認識されなかったオブジェクト(^C)の後続エイリアスは無効
になる。
によって認識されないときは、問題が発生する。図7Bに示す上記例では、スト
リームリーダがストリーム化バージョンのオブジェクト720を読まないと、問
題が発生する。このようなことが起こるのは、オブジェクト720がエクステン
ションの一部であったか、リーダによってスキップされた代替であったときであ
る。その場合、認識されなかったオブジェクト(^C)の後続エイリアスは無効
になる。
【0119】 この問題が発生するのを防止するために、本発明によるデータ互換性システム
では、ストリームライタは、参照されたオブジェクトが、あるリーダによって読
み取られなかったこと、を検出するように改良されている。そのとき、ストリー
ムライタは、通常のエイリアスを書くのではなく、「ローバスト」エイリアス (
robust alias)をストリーム上に書く。ローバストエイリアスはエイリアス情報 プラス、エイリアス付きオブジェクトの再ストリーム化コピーを収めている。ロ
ーバストエイリアスが読み取られるとき、リーダはエイリアス付きオブジェクト
が現れたかどうかをチェックする。現れていれば、ポインタをフィックスアップ
(fix up)し、再ストリーム化コピーをスキップする。エイリアス付きオブジェク
トが現れていなければ、次へ進み、再ストリーム化オブジェクトをローバストエ
イリアスから読み取る。
では、ストリームライタは、参照されたオブジェクトが、あるリーダによって読
み取られなかったこと、を検出するように改良されている。そのとき、ストリー
ムライタは、通常のエイリアスを書くのではなく、「ローバスト」エイリアス (
robust alias)をストリーム上に書く。ローバストエイリアスはエイリアス情報 プラス、エイリアス付きオブジェクトの再ストリーム化コピーを収めている。ロ
ーバストエイリアスが読み取られるとき、リーダはエイリアス付きオブジェクト
が現れたかどうかをチェックする。現れていれば、ポインタをフィックスアップ
(fix up)し、再ストリーム化コピーをスキップする。エイリアス付きオブジェク
トが現れていなければ、次へ進み、再ストリーム化オブジェクトをローバストエ
イリアスから読み取る。
【0120】 ローバストエイリアスが使用されるケースとしては、いくつかがある。例えば
、ローバストエイリアスはクラスエクステンションで使用することができる。ク
ラスエクステンションはリーダによって読み取られないことがあるので、リーダ
が出会うエイリアスは、それがカレントクラスエクステンションまたはカレント
エクステンションの親クラスの外にあるクラス情報(これはオブジェクトを作成
している)を参照していると、無効である可能性がある。後者の場合には、ロー
バストエイリアスを書き出さなければならない。そうでなければ、単純エイリア
ス (simple alias) が使用できる。
、ローバストエイリアスはクラスエクステンションで使用することができる。ク
ラスエクステンションはリーダによって読み取られないことがあるので、リーダ
が出会うエイリアスは、それがカレントクラスエクステンションまたはカレント
エクステンションの親クラスの外にあるクラス情報(これはオブジェクトを作成
している)を参照していると、無効である可能性がある。後者の場合には、ロー
バストエイリアスを書き出さなければならない。そうでなければ、単純エイリア
ス (simple alias) が使用できる。
【0121】 明らかなように、代替の間にエイリアシングがあり得ないのは、多くてもそれ
らの1つが読み取られるからである。従って、2つの代替が同じオブジェクトを
参照するときは、2回ストリーム化されるはずである。しかし、代替の一方にオ
ブジェクトへの外部参照がある場合は、その代替は読み取られることもあれば、
読み取られないこともあるので、ローバストエイリアスをストリーム化しなけれ
ばならない。
らの1つが読み取られるからである。従って、2つの代替が同じオブジェクトを
参照するときは、2回ストリーム化されるはずである。しかし、代替の一方にオ
ブジェクトへの外部参照がある場合は、その代替は読み取られることもあれば、
読み取られないこともあるので、ローバストエイリアスをストリーム化しなけれ
ばならない。
【0122】 別のケースは、2つ以上の代替に現れるオブジェクトへの外部参照に関係する
ものである。例えば、2つの代替の各々が、あるオブジェクトのコピーを収めて
いて、外部オブジェクトもそのオブジェクトを参照しているとする。外部オブジ
ェクトが代替の一方にあるオブジェクトを参照していれば、そのときその参照は
、他方の代替を選択するストリームリーダでは壊されることになる。
ものである。例えば、2つの代替の各々が、あるオブジェクトのコピーを収めて
いて、外部オブジェクトもそのオブジェクトを参照しているとする。外部オブジ
ェクトが代替の一方にあるオブジェクトを参照していれば、そのときその参照は
、他方の代替を選択するストリームリーダでは壊されることになる。
【0123】 本発明の原理によれば、重複オブジェクトに関する情報は代替ラッパ (altern
ate wrapper) に保管されている。各代替は、エクステンションと同じように、 ストリーム上でその前にその長さを置くことができるようにラップされ、重複オ
ブジェクト情報は長さと一緒にストリーム上に書かれる。上記の例では、第2の
代替は、それが参照するオブジェクトが第1オブジェクトによって参照されるオ
ブジェクトと同じであることを示す情報を含むことができる。代替ヘッダは自動
的に読み取られるので、この情報はすべてのリーダに現れることになる。リーダ
はこの情報を使用してコンテキストを更新し、それがどちらの代替を選択したか
に関係なく、参照を保存している。
ate wrapper) に保管されている。各代替は、エクステンションと同じように、 ストリーム上でその前にその長さを置くことができるようにラップされ、重複オ
ブジェクト情報は長さと一緒にストリーム上に書かれる。上記の例では、第2の
代替は、それが参照するオブジェクトが第1オブジェクトによって参照されるオ
ブジェクトと同じであることを示す情報を含むことができる。代替ヘッダは自動
的に読み取られるので、この情報はすべてのリーダに現れることになる。リーダ
はこの情報を使用してコンテキストを更新し、それがどちらの代替を選択したか
に関係なく、参照を保存している。
【0124】 この新データは既存ラッパクラスのエクステンションであるので、新等価デー
タは長さの前にストリーム化されていなければならない(このようにすると、よ
り古いフレームワークで作られたアプリケーションはそれをスキップできる)。
等価情報の量は事前に分からないので、最大数の重複を収容できるだけの十分な
スペースをストリーム上に残しておく必要がある。この最大数は、以前の代替す
べてでストリーム化されたオブジェクトの数である。
タは長さの前にストリーム化されていなければならない(このようにすると、よ
り古いフレームワークで作られたアプリケーションはそれをスキップできる)。
等価情報の量は事前に分からないので、最大数の重複を収容できるだけの十分な
スペースをストリーム上に残しておく必要がある。この最大数は、以前の代替す
べてでストリーム化されたオブジェクトの数である。
【0125】 本発明によるデータ互換性システムでは、与えられたストリームをラップし、
ストリーム化データをフィルタリングするオブジェクトを構築するプライベート
ストリームラッパクラスが取り入れられている。これらのクラスの全部は、図5
と図6に示すストリームラップクラス階層に含まれている。これらのプライベー
トクラスには、ローバストエイリアスのストリーム化を処理するTRobustAliasIn
putStreamクラス606とTRobustAliasOutputStreamクラス610、および、以 下で説明するように、代替のストリーム化を最適化するために使用されるTAlter
nateEnableStreamクラス506が含まれている。
ストリーム化データをフィルタリングするオブジェクトを構築するプライベート
ストリームラッパクラスが取り入れられている。これらのクラスの全部は、図5
と図6に示すストリームラップクラス階層に含まれている。これらのプライベー
トクラスには、ローバストエイリアスのストリーム化を処理するTRobustAliasIn
putStreamクラス606とTRobustAliasOutputStreamクラス610、および、以 下で説明するように、代替のストリーム化を最適化するために使用されるTAlter
nateEnableStreamクラス506が含まれている。
【0126】 ストリーム化データをトラッキングするほかに、ラッパはストリーム化を最適
化することもできる。1つの例として、TAlternateEnableStreamクラス506か
ら構築されるTAlternateEnableStreamがある。後者のストリームは、代替がスト
リーム化されるかどうかを制御するデリゲートストリームである。前述したよう
に、代替を構築し、ストリーム化するプロセスはストリーム化プロセスを著しく
低速化する可能性があるので、重要なことは代替のストリーム化を可能な限り避
けることである。また、上記説明したように、代替をストリーム化する必要があ
るのは、オブジェクトが持続的ストリームにフラット化されるときだけである。
オブジェクトのストリーム化演算子内では、ストリームが持続的であるかどうか
を判断することが可能であるが、オブジェクトがフラット化されるかどうかを判
断することは不可能である。後者の条件を判断するためには、Flatten()関数は 、オブジェクトがフラット化され、単態的にストリーム化されないことをストリ
ーム化演算子に通知できるようになっている必要がある。
化することもできる。1つの例として、TAlternateEnableStreamクラス506か
ら構築されるTAlternateEnableStreamがある。後者のストリームは、代替がスト
リーム化されるかどうかを制御するデリゲートストリームである。前述したよう
に、代替を構築し、ストリーム化するプロセスはストリーム化プロセスを著しく
低速化する可能性があるので、重要なことは代替のストリーム化を可能な限り避
けることである。また、上記説明したように、代替をストリーム化する必要があ
るのは、オブジェクトが持続的ストリームにフラット化されるときだけである。
オブジェクトのストリーム化演算子内では、ストリームが持続的であるかどうか
を判断することが可能であるが、オブジェクトがフラット化されるかどうかを判
断することは不可能である。後者の条件を判断するためには、Flatten()関数は 、オブジェクトがフラット化され、単態的にストリーム化されないことをストリ
ーム化演算子に通知できるようになっている必要がある。
【0127】 本発明の原理によれば、Flatten()関数は、与えられたストリームをTAlternat
eEnableStreamでラップし、後者をオブジェクトのストリーム化演算子に渡すこ とによってこれを行っている。このオペレーションは図8に示されている。オブ
ジェクト804のFlatten()関数802は、まず、代替が必要であるかどうかを 、ストリームが必要かどうかを判断することによって判断する。代替が必要であ
れば、Flatten()関数はクラス806(これはTDelegatingStreamクラス800か
ら派生している)からTAlternateEnableStreamを構築し、ストリームをそれでラ
ップする。
eEnableStreamでラップし、後者をオブジェクトのストリーム化演算子に渡すこ とによってこれを行っている。このオペレーションは図8に示されている。オブ
ジェクト804のFlatten()関数802は、まず、代替が必要であるかどうかを 、ストリームが必要かどうかを判断することによって判断する。代替が必要であ
れば、Flatten()関数はクラス806(これはTDelegatingStreamクラス800か
ら派生している)からTAlternateEnableStreamを構築し、ストリームをそれでラ
ップする。
【0128】 ストリーム化演算子が代替を定義していれば、クラス808から構築されたTA
lternateOutputStreamがそこに入れられる。構築時に、TAlternateOutputStream
はストリームのタイプをチェックする。それがTAlternateEnableStreamであれば
、その時オブジェクトがフラット化されること、従って、代替をストリーム化さ
せることがTAlternateOutputStreamに知らされる。ストリームがTAlternateEnab
leStreamでなければ、その時オブジェクトはストリーム化されるだけであるので
、代替は必要とされない。
lternateOutputStreamがそこに入れられる。構築時に、TAlternateOutputStream
はストリームのタイプをチェックする。それがTAlternateEnableStreamであれば
、その時オブジェクトがフラット化されること、従って、代替をストリーム化さ
せることがTAlternateOutputStreamに知らされる。ストリームがTAlternateEnab
leStreamでなければ、その時オブジェクトはストリーム化されるだけであるので
、代替は必要とされない。
【0129】 TAlternateEnableStreamクラス506は、TAlternateOutputStreamオブジェク
トが代替をストリーム化することを可能にする内部デリゲートストリームを構築
する。TAlternateEnableStreamクラスの宣言は次の通りである。
トが代替をストリーム化することを可能にする内部デリゲートストリームを構築
する。TAlternateEnableStreamクラスの宣言は次の通りである。
【0130】
【数31】
【0131】 TRobustAliasOutputStreamクラス610は、ローバストエイリアスをストリー
ムに書き出すオブジェクトを構築する。そのクラス宣言は次の通りである。
ムに書き出すオブジェクトを構築する。そのクラス宣言は次の通りである。
【0132】
【数32】
【0133】 TRobustAliasInputStreamクラス606は、ローバストエイリアスをストリー ムから読み取るオブジェクトを構築する。その宣言は次の通りである。
【0134】
【数33】
【0135】 プライベートストリームラッパクラスはプライベートストリームヘッダクラス
を使用して実行されており、ヘッダクラスには、その長さ、データに収められて
いるフラット化オブジェクトの数、および外部オブジェクトにエイリアスがある
かどうか、といったラップデータに関する統計が収められている。このデータに
は、ストリームからのもの、コンテキストからのもの、および他の場所からのも
のがある。ヘッダには、各タイプのデータをトラッキングするように特殊化され
たものがある。完全なストリームヘッダクラス階層は図9に示されている。
を使用して実行されており、ヘッダクラスには、その長さ、データに収められて
いるフラット化オブジェクトの数、および外部オブジェクトにエイリアスがある
かどうか、といったラップデータに関する統計が収められている。このデータに
は、ストリームからのもの、コンテキストからのもの、および他の場所からのも
のがある。ヘッダには、各タイプのデータをトラッキングするように特殊化され
たものがある。完全なストリームヘッダクラス階層は図9に示されている。
【0136】 各セットのラッパクラスは独自のヘッダクラスをもっている。例えば、TAlter
nateInputStreamオブジェクトとTAlternateOutputStreamオブジェクトはTAltern
ateStreamHeaderクラス902を使用し、TExtensionInputStreamオブジェクトと
TExtensionOutputStreamオブジェクトはTExtensionStreamHeaderクラス904を
使用している。ヘッダクラス902と904の各々は共通の親クラスであるTStr
eamHeader900から派生し、その特定ラッパにとって重要なストリームデータ だけをトラッキングするように特殊化されている。
nateInputStreamオブジェクトとTAlternateOutputStreamオブジェクトはTAltern
ateStreamHeaderクラス902を使用し、TExtensionInputStreamオブジェクトと
TExtensionOutputStreamオブジェクトはTExtensionStreamHeaderクラス904を
使用している。ヘッダクラス902と904の各々は共通の親クラスであるTStr
eamHeader900から派生し、その特定ラッパにとって重要なストリームデータ だけをトラッキングするように特殊化されている。
【0137】 TStreamHeaderクラス900は基本ヘッダクラスである。これは、ラップデー タの長さ、ラップオブジェクトの数、およびデータが自己完結 (self contained
) であるかどうか、を記録している。そのクラス宣言は次の通りである。
) であるかどうか、を記録している。そのクラス宣言は次の通りである。
【0138】
【数34】
【0139】 TAlternateStreamHeaderクラス902は、代替間のエイリアスを記録するため
に使用されるオブジェクトインデックスの配列を保存しているオブジェクトを構
築する。クラス宣言は次の通りである。
に使用されるオブジェクトインデックスの配列を保存しているオブジェクトを構
築する。クラス宣言は次の通りである。
【0140】
【数35】
【0141】 TExtensionStreamHeaderクラス904は、このエクステンションに入っている
データが、以前のすべてのクラスデータに直交しているかどうかを示す直交フラ
グ (orthogonal flag) を収めているオブジェクトを構築する。クラス宣言は次 の通りである。
データが、以前のすべてのクラスデータに直交しているかどうかを示す直交フラ
グ (orthogonal flag) を収めているオブジェクトを構築する。クラス宣言は次 の通りである。
【0142】
【数36】
【0143】 TRobustAliasHeaderクラス906は、エイリアス付きオブジェクトのIDを収め
ているオブジェクトを構築する。クラス宣言は次の通りである。
ているオブジェクトを構築する。クラス宣言は次の通りである。
【0144】
【数37】
【0145】 図10はストリームヘッダの使い方を示している。TAlternateOutputStream1
000は、TBufferedOutputStream1002を初期化するために使用されるTAlte
rnateStreamHeader1006を所有している。TBufferedOutputStream1002は
ヘッダにエイリアスを付け、それとバッファ内データとの同期を保っている。バ
ッファ内データをストリームアウトする時間になると、TBufferedOutputStream 1002は、ヘッダがバッファ内データの前にストリームに書かれていることを
確かめる。
000は、TBufferedOutputStream1002を初期化するために使用されるTAlte
rnateStreamHeader1006を所有している。TBufferedOutputStream1002は
ヘッダにエイリアスを付け、それとバッファ内データとの同期を保っている。バ
ッファ内データをストリームアウトする時間になると、TBufferedOutputStream 1002は、ヘッダがバッファ内データの前にストリームに書かれていることを
確かめる。
【0146】 プライベートストリームコンテキストクラス 上述したエイリアスの問題を処理するために、本発明によるデータ互換性シス
テムでは、オブジェクト間のネストされた可視スコープ (scopes of visibility
) をサポートする新規のTContextクラスが使用されている。これは、アプリケー
ションがスタック上にプッシュし、スタックからポップして可視範囲を定義でき
るようにする「仮想」コンテキストのスタックを構築し、維持している。また、
各オブジェクトと共に可視フラグ (visibility flag) をストアし、与えられた オブジェクトの可視性をコンテキストに入れて戻すIsVisible()メソッドを用意 している。
テムでは、オブジェクト間のネストされた可視スコープ (scopes of visibility
) をサポートする新規のTContextクラスが使用されている。これは、アプリケー
ションがスタック上にプッシュし、スタックからポップして可視範囲を定義でき
るようにする「仮想」コンテキストのスタックを構築し、維持している。また、
各オブジェクトと共に可視フラグ (visibility flag) をストアし、与えられた オブジェクトの可視性をコンテキストに入れて戻すIsVisible()メソッドを用意 している。
【0147】 TContextクラスは、ストリームオブジェクトへの参照を保存しておくために使
用されるプライベートクラスである。これは、前述したCommonpointフレームワ ークに見られるTContextの改良したものである。データ互換性に関して最も注目
すべき追加は、仮想コンテキストスタック (virtual context stack) とエクス トラオブジェクトデータ (extra object data) であり、これらについては以下 で説明する。TContextクラスはパブリックTContextObjectDataオブジェクトイン
スタンスも構築し、オブジェクトデータを保存するようにしている。TContextOb
jectDataインスタンスは、Add()、AddAt()、Find()、IncrementCount()、Remove
()およびReset()メソッドをTContextオブジェクトで使用することにより作成さ れ、維持される。TContextのクラス宣言は次の通りである。
用されるプライベートクラスである。これは、前述したCommonpointフレームワ ークに見られるTContextの改良したものである。データ互換性に関して最も注目
すべき追加は、仮想コンテキストスタック (virtual context stack) とエクス トラオブジェクトデータ (extra object data) であり、これらについては以下 で説明する。TContextクラスはパブリックTContextObjectDataオブジェクトイン
スタンスも構築し、オブジェクトデータを保存するようにしている。TContextOb
jectDataインスタンスは、Add()、AddAt()、Find()、IncrementCount()、Remove
()およびReset()メソッドをTContextオブジェクトで使用することにより作成さ れ、維持される。TContextのクラス宣言は次の通りである。
【0148】
【数38−1】
【0149】
【数38−2】
【数38−3】
【0150】 TVirtualContextクラスは、コンテキスト内のオブジェクトのスコープを定義 するために使用される実行クラスである。これについては、以下で説明し、クラ
ス宣言は次のようになっている。
ス宣言は次のようになっている。
【0151】
【数39】
【0152】 上述したデータ互換性データライタTExtensionOutputStreamとTAlternateOutp
utStreamは、定義された範囲が受け取り側の視点を表すように仮想コンテキスト
のスタックを操作するようにコーディングされている。オブジェクトが可視であ
れば、これはストリームリーダによって読み取られていなければならないことを
意味する。従って、Flatten()関数のエイリアシングコードは、単純エイリアス を可視オブジェクトに、ローバストエイリアスを可視でないオブジェクトに書く
ことができる。
utStreamは、定義された範囲が受け取り側の視点を表すように仮想コンテキスト
のスタックを操作するようにコーディングされている。オブジェクトが可視であ
れば、これはストリームリーダによって読み取られていなければならないことを
意味する。従って、Flatten()関数のエイリアシングコードは、単純エイリアス を可視オブジェクトに、ローバストエイリアスを可視でないオブジェクトに書く
ことができる。
【0153】 可視フラグを維持するアルゴリズムは単純である。コンテキストに置かれてい
る各オブジェクトは自動的に可視にされる。新しい仮想コンテキストがスタック
上にプッシュされるときは、なにも変更されない。しかし、仮想コンテキストが
スタックからポップされるときは、その仮想コンテキスト内のオブジェクトのす
べて(つまり、その仮想コンテキストがスタックに置かれているときコンテキス
トに追加されたオブジェクトのすべて)は不可視のマークが付けられる。
る各オブジェクトは自動的に可視にされる。新しい仮想コンテキストがスタック
上にプッシュされるときは、なにも変更されない。しかし、仮想コンテキストが
スタックからポップされるときは、その仮想コンテキスト内のオブジェクトのす
べて(つまり、その仮想コンテキストがスタックに置かれているときコンテキス
トに追加されたオブジェクトのすべて)は不可視のマークが付けられる。
【0154】 仮想コンテキストがスタック上にプッシュされ、スタックからポップされると
きのオペレーションのシーケンスは図11A〜図11Fに示されている。これら
の図は、書かれているストリーム上のTContext::IsVisibleの戻り値を示してい る。各イメージの上部にある太線の水平ライン、例えば、ライン1100はスト
リームを表し、各イメージの下部にある階段状ラインはストリーム上の仮想コン
テキストのスタックを表している。下向き矢印、例えば、矢印1102は、仮想
コンテキストがいつスタック上にプッシュされたかを示し、上向き矢印、例えば
、矢印1104は、仮想コンテキストがいつスタックからポップされたかを示し
ている。オブジェクトは、各図の左から右にストリーム上に書かれ、各図の右向
き矢印はストリームの現在位置を表している。ストリーム上のエリア1106の
ようなハッチされたエリアは現在位置から見えるオブジェクトを表し(IsVisibl
e()はTRUEを戻す)、ストリーム上の明るいエリアは現在位置から見えないオブ ジェクトを表している(IsVisible()はFALSEを戻す)。仮想コンテキストがポッ
プされるときはいつでも、その仮想コンテキスト内のストリームに書かれたオブ
ジェクトのすべては不可視のマークが付けられることに注意されたい。
きのオペレーションのシーケンスは図11A〜図11Fに示されている。これら
の図は、書かれているストリーム上のTContext::IsVisibleの戻り値を示してい る。各イメージの上部にある太線の水平ライン、例えば、ライン1100はスト
リームを表し、各イメージの下部にある階段状ラインはストリーム上の仮想コン
テキストのスタックを表している。下向き矢印、例えば、矢印1102は、仮想
コンテキストがいつスタック上にプッシュされたかを示し、上向き矢印、例えば
、矢印1104は、仮想コンテキストがいつスタックからポップされたかを示し
ている。オブジェクトは、各図の左から右にストリーム上に書かれ、各図の右向
き矢印はストリームの現在位置を表している。ストリーム上のエリア1106の
ようなハッチされたエリアは現在位置から見えるオブジェクトを表し(IsVisibl
e()はTRUEを戻す)、ストリーム上の明るいエリアは現在位置から見えないオブ ジェクトを表している(IsVisible()はFALSEを戻す)。仮想コンテキストがポッ
プされるときはいつでも、その仮想コンテキスト内のストリームに書かれたオブ
ジェクトのすべては不可視のマークが付けられることに注意されたい。
【0155】 スタックベースの親子関係のほかに、仮想コンテキストは兄弟 (sibling) 関 係もサポートしている。値がTRUEでインスタンス生成される仮想コンテキストは
、以前にポップされた仮想コンテキストの兄弟であると宣言される。図12A〜
図12Hは、書かれているストリーム上のTContext::IsInSiblingContextの戻り
値を示している。各イメージの上部にある太線の水平ライン、例えば、ライン1
200はストリームを表し、各イメージの下部の階段状ラインはストリーム上の
仮想コンテキストのスタックを表している。下向き矢印、例えば、矢印1202
は、仮想コンテキストがいつスタック上にプッシュされたかを示し、上向き矢印
、例えば、矢印1204は、仮想コンテキストがいつスタックからポップされた
かを示している。S付きの下向き矢印、例えば、矢印1206は、兄弟仮想コン
テキストがいつスタック上にプッシュされたかを示している。オブジェクトは各
図の左から右にストリーム上に書かれ、各図の右向き矢印はストリームの現在位
置を示している。ストリーム上の陰影エリア、例えば、エリア1208は現在位
置からの兄弟コンテキスト内にあるオブジェクトを表し、一方ストリーム上の明
るいエリアは現在位置からの兄弟コンテキスト内にないオブジェクトを表してい
る。兄弟関係は、それが兄弟コンテキストであったかどうかに関係なく、以前に
ポップされたコンテキストに適用され、兄弟関係は過渡的なものであることに注
意されたい。
、以前にポップされた仮想コンテキストの兄弟であると宣言される。図12A〜
図12Hは、書かれているストリーム上のTContext::IsInSiblingContextの戻り
値を示している。各イメージの上部にある太線の水平ライン、例えば、ライン1
200はストリームを表し、各イメージの下部の階段状ラインはストリーム上の
仮想コンテキストのスタックを表している。下向き矢印、例えば、矢印1202
は、仮想コンテキストがいつスタック上にプッシュされたかを示し、上向き矢印
、例えば、矢印1204は、仮想コンテキストがいつスタックからポップされた
かを示している。S付きの下向き矢印、例えば、矢印1206は、兄弟仮想コン
テキストがいつスタック上にプッシュされたかを示している。オブジェクトは各
図の左から右にストリーム上に書かれ、各図の右向き矢印はストリームの現在位
置を示している。ストリーム上の陰影エリア、例えば、エリア1208は現在位
置からの兄弟コンテキスト内にあるオブジェクトを表し、一方ストリーム上の明
るいエリアは現在位置からの兄弟コンテキスト内にないオブジェクトを表してい
る。兄弟関係は、それが兄弟コンテキストであったかどうかに関係なく、以前に
ポップされたコンテキストに適用され、兄弟関係は過渡的なものであることに注
意されたい。
【0156】 非兄弟仮想コンテキストは、エクステンションを実行するために使用される。
構築され、初期化されるとき、TOutputExtensionStreamオブジェクトは非兄弟仮
想コンテキストをスタック上にプッシュする。破壊時には、TOutputExtensionSt
reamデストラクタ(destructor) は仮想コンテキストをスタックからポップし、 コンテキストに追加されていた拡張オブジェクトはすべて不可視にされる。この
ことは、これらの拡張オブジェクトの後続エイリアスがローバストであることを
示している。
構築され、初期化されるとき、TOutputExtensionStreamオブジェクトは非兄弟仮
想コンテキストをスタック上にプッシュする。破壊時には、TOutputExtensionSt
reamデストラクタ(destructor) は仮想コンテキストをスタックからポップし、 コンテキストに追加されていた拡張オブジェクトはすべて不可視にされる。この
ことは、これらの拡張オブジェクトの後続エイリアスがローバストであることを
示している。
【0157】 兄弟コンテキストは代替を実行するために使用される。最初の代替の開始時に
、TAlternateOutputStreamオブジェクトは非兄弟仮想コンテキストをスタック上
にプッシュし、その代替の終了時に、TAlternateOutputStreamオブジェクトは非
兄弟仮想コンテキストをスタックからポップする。各後続代替の開始時に、TAlt
ernateOutputStreamオブジェクトは兄弟仮想コンテキストをスタック上にプッシ
ュし、その代替の終了時に、それをスタックからポップする。このようにすると
、内部ストリーミングコードはInSiblingContext()メソッドを使用して、参照さ
れたオブジェクトが以前の代替に現れているかどうかを判断することができる。
現れていれば、その時ストリーミングコードはこの情報を代替のヘッダに記録す
る。
、TAlternateOutputStreamオブジェクトは非兄弟仮想コンテキストをスタック上
にプッシュし、その代替の終了時に、TAlternateOutputStreamオブジェクトは非
兄弟仮想コンテキストをスタックからポップする。各後続代替の開始時に、TAlt
ernateOutputStreamオブジェクトは兄弟仮想コンテキストをスタック上にプッシ
ュし、その代替の終了時に、それをスタックからポップする。このようにすると
、内部ストリーミングコードはInSiblingContext()メソッドを使用して、参照さ
れたオブジェクトが以前の代替に現れているかどうかを判断することができる。
現れていれば、その時ストリーミングコードはこの情報を代替のヘッダに記録す
る。
【0158】 仮想コンテキストスタックのほかに、TContextはエクストラオブジェクトデー
タを保存している。このエクストラオブジェクトデータは可視フラグとエイリア
スフラグから構成され、このデータはTContextObjectDataと名付けたプライベー
ト実装クラスから作られたオブジェクトに保存されている。TContextは各オブジ
ェクトの可視フラグを上述したようにセットし、IsVisible()メソッドでその値 にアクセスできるようにしている。TContextはエイリアスフラグをセットしない
が、その代わりに、この値に対してMakeAlias()セッタメソッドを用意している 。TContext::Findはエイリアスフラグを使用する。要求されたオブジェクトはNI
Lであるが、エイリアス値をもっていれば、Find()はそのエイリアス値を戻して くる。これは、前のセクションで説明した「複数代替のエイリアシング」問題を
部分的に解決している。
タを保存している。このエクストラオブジェクトデータは可視フラグとエイリア
スフラグから構成され、このデータはTContextObjectDataと名付けたプライベー
ト実装クラスから作られたオブジェクトに保存されている。TContextは各オブジ
ェクトの可視フラグを上述したようにセットし、IsVisible()メソッドでその値 にアクセスできるようにしている。TContextはエイリアスフラグをセットしない
が、その代わりに、この値に対してMakeAlias()セッタメソッドを用意している 。TContext::Findはエイリアスフラグを使用する。要求されたオブジェクトはNI
Lであるが、エイリアス値をもっていれば、Find()はそのエイリアス値を戻して くる。これは、前のセクションで説明した「複数代替のエイリアシング」問題を
部分的に解決している。
【0159】 ストリーミングサポート関数 ReadVersion()関数とWriteVersion()関数は、本発明によるストリームフォー マット拡張ストラテジを受け入れるように改良されている。改良版WriteVersion
()関数は、ストリーム上にエクステンションが存在することを示し、オプション
として、それがストリームに書き出す拡張ビットバケットを受け付けている。改
良版ReadVersion()関数は、未知のエクステンションをスキップし、オプション として、それらをビットバケットに格納し、理解できるストリームをアプリケー
ションに送り返す。次に示したものは、ReadVersion()関数の実行である。これ は単なる例示目的であり、これに限定されるものではない。
()関数は、ストリーム上にエクステンションが存在することを示し、オプション
として、それがストリームに書き出す拡張ビットバケットを受け付けている。改
良版ReadVersion()関数は、未知のエクステンションをスキップし、オプション として、それらをビットバケットに格納し、理解できるストリームをアプリケー
ションに送り返す。次に示したものは、ReadVersion()関数の実行である。これ は単なる例示目的であり、これに限定されるものではない。
【0160】
【数40】
【0161】 次は、WriteVersion()関数の擬似コードの例である。
【0162】
【数41】
【0163】 前述したように、Flatten()とResurrect()の関数は多態ストリーミングを実行
する。以下は、これらの関数のオペレーションのハイレベルな記述である。
する。以下は、これらの関数のオペレーションのハイレベルな記述である。
【0164】
【数42】
【0165】 以下は、復元 (resurrect) 関数のハイレベルな記述例である。
【0166】
【数43−1】
【0167】
【数43−2】
【0168】
【数43−3】
【0169】 Flatten()関数とResurrect()関数のパブリックセクションの説明で言及されて
いるように、ビットバケットを受け付け、その代替をもたないオブジェクトをフ
ラット化するバージョンもある。これらの関数は、与えられたストリームをTAlt
ernateEnableStreamオブジェクトでラップしそこなうことによって、オブジェク
トがその代替をストリーム化することを禁止している。これは、TAlternateOutp
utStreamオブジェクトは、ラップするストリームのタイプがTAlternateEnableSt
reamであれば代替を受け付けるだけなので、オブジェクトのストリームアウト演
算子でのTAlternateEnableStreamオブジェクトを使用不可にする。TAlternateEn
ableStreamの使用が禁止されると、最初の代替(そのオブジェクト自身)だけが
ストリームに書かれる。
いるように、ビットバケットを受け付け、その代替をもたないオブジェクトをフ
ラット化するバージョンもある。これらの関数は、与えられたストリームをTAlt
ernateEnableStreamオブジェクトでラップしそこなうことによって、オブジェク
トがその代替をストリーム化することを禁止している。これは、TAlternateOutp
utStreamオブジェクトは、ラップするストリームのタイプがTAlternateEnableSt
reamであれば代替を受け付けるだけなので、オブジェクトのストリームアウト演
算子でのTAlternateEnableStreamオブジェクトを使用不可にする。TAlternateEn
ableStreamの使用が禁止されると、最初の代替(そのオブジェクト自身)だけが
ストリームに書かれる。
本発明の上記およびその他の利点の理解を容易にするために、添付図面を参照
して、以下で説明する。
して、以下で説明する。
【図1】 本発明を具現化しているソフトウェアプログラムを実行できる従来のコンピュ
ータシステムの概略ブロック図である。
ータシステムの概略ブロック図である。
【図2】 オブジェクト情報をストリーム化して、一方のアプリケーションプログラムか
ら他方に渡すときに係わりをもつメインエレメントを示すブロック概略図である
。
ら他方に渡すときに係わりをもつメインエレメントを示すブロック概略図である
。
【図3】 エクステンションをもつオブジェクトのストリーム化クラスコードの概略図で
あり、そこでは、クラス情報がどのようにフォーマットされ、書き出され、読み
取られるかを示している。
あり、そこでは、クラス情報がどのようにフォーマットされ、書き出され、読み
取られるかを示している。
【図4】 代替をもつオブジェクトのストリーム化クラスコードの概略図であり、そこで
は、クラス情報がどのようにフォーマッティングされ、書き出され、読み取られ
るかを示している。
は、クラス情報がどのようにフォーマッティングされ、書き出され、読み取られ
るかを示している。
【図5】 本発明によるストリーミングサポートクラスのクラス階層図である。
【図6】 TBufferSupportStreamクラスから派生した、本発明によるストリーミングサポ
ートクラスのより詳細なクラス階層図である。
ートクラスのより詳細なクラス階層図である。
【図7A】 参照を使用しないオブジェクトストリーミングを示す概略図である。
【図7B】 参照を使用するオブジェクトストリーミングを示す概略図である。
【図8】 TAlternateOutputStreamオブジェクトをラップして代替を使用できるようにす
るTAlternateEnableStreamオブジェクトの使い方を示す概略図である。
るTAlternateEnableStreamオブジェクトの使い方を示す概略図である。
【図9】 本発明によるストリームヘッダサポートクラスのクラス階層図である。
【図10】 ストリームヘッダクラスの使用を示す概略図である。
【図11A】 ストリームに書き出されるオブジェクトの可視性を制御するために仮想コンテ
キストの使用を示す概略データストリーム図である。
キストの使用を示す概略データストリーム図である。
【図11B】 ストリームに書き出されるオブジェクトの可視性を制御するために仮想コンテ
キストの使用を示す概略データストリーム図である。
キストの使用を示す概略データストリーム図である。
【図11C】 ストリームに書き出されるオブジェクトの可視性を制御するために仮想コンテ
キストの使用を示す概略データストリーム図である。
キストの使用を示す概略データストリーム図である。
【図11D】 ストリームに書き出されるオブジェクトの可視性を制御するために仮想コンテ
キストの使用を示す概略データストリーム図である。
キストの使用を示す概略データストリーム図である。
【図11E】 ストリームに書き出されるオブジェクトの可視性を制御するために仮想コンテ
キストの使用を示す概略データストリーム図である。
キストの使用を示す概略データストリーム図である。
【図11F】 ストリームに書き出されるオブジェクトの可視性を制御するために仮想コンテ
キストの使用を示す概略データストリーム図である。
キストの使用を示す概略データストリーム図である。
【図11G】 ストリームに書き出されるオブジェクトの可視性を制御するために仮想コンテ
キストの使用を示す概略データストリーム図である。
キストの使用を示す概略データストリーム図である。
【図11H】 ストリームに書き出されるオブジェクトの可視性を制御するために仮想コンテ
キストの使用を示す概略データストリーム図である。
キストの使用を示す概略データストリーム図である。
【図12A】 ストリームに書き出されるオブジェクトの兄弟関係を制御するために仮想コン
テキストの使用を示す概略データストリーム図である。
テキストの使用を示す概略データストリーム図である。
【図12B】 ストリームに書き出されるオブジェクトの兄弟関係を制御するために仮想コン
テキストの使用を示す概略データストリーム図である。
テキストの使用を示す概略データストリーム図である。
【図12C】 ストリームに書き出されるオブジェクトの兄弟関係を制御するために仮想コン
テキストの使用を示す概略データストリーム図である。
テキストの使用を示す概略データストリーム図である。
【図12D】 ストリームに書き出されるオブジェクトの兄弟関係を制御するために仮想コン
テキストの使用を示す概略データストリーム図である。
テキストの使用を示す概略データストリーム図である。
【図12E】 ストリームに書き出されるオブジェクトの兄弟関係を制御するために仮想コン
テキストの使用を示す概略データストリーム図である。
テキストの使用を示す概略データストリーム図である。
【図12F】 ストリームに書き出されるオブジェクトの兄弟関係を制御するために仮想コン
テキストの使用を示す概略データストリーム図である。
テキストの使用を示す概略データストリーム図である。
【図12G】 ストリームに書き出されるオブジェクトの兄弟関係を制御するために仮想コン
テキストの使用を示す概略データストリーム図である。
テキストの使用を示す概略データストリーム図である。
【図12H】 ストリームに書き出されるオブジェクトの兄弟関係を制御するために仮想コン
テキストの使用を示す概略データストリーム図である。
テキストの使用を示す概略データストリーム図である。
───────────────────────────────────────────────────── フロントページの続き (72)発明者 デイビス マーク アメリカ合衆国 94025 カリフォルニア 州 メンロ パーク アルピン ロード 2509 Fターム(参考) 5B076 AB10 AC01 DD05 DF06 【要約の続き】 2番目の代替オブジェクト情報が理解できないときは、 リーダはその理解不能オブジェクト情報をスキップし、 各代替オブジェクトついて継続する。代替オブジェクト のどれもが理解されなかったときは、例外がスロー (th row) される。ある実施例では、使用されない代替オブ ジェクトの情報は破棄されないが、代わりに一時記憶域 に格納される。そのあと、オブジェクトが再びストリー ムアウトされると、格納情報が追加され、ストリームに 戻される。
Claims (30)
- 【請求項1】 第1のフレームワークバージョンで作成された第1のオブジ
ェクト指向プログラムが、オブジェクト情報を多態的にストリーム化して、第2
のフレームワークバージョンで作成された第2のオブジェクト指向プログラムに
渡すことを可能にする装置であって、該装置は、 第1オブジェクト指向プログラムに置かれていて、第1オブジェクト指向プロ
グラムによって認識されるオリジナルオブジェクト情報と第2オブジェクト指向
プログラムによって認識される置換オブジェクト情報をストリーム化するストリ
ームライタ関数と、 第2オブジェクト指向プログラムに置かれていて、オリジナルオブジェクト情
報が第2オブジェクト指向プログラムによって認識されるときはオリジナルオブ
ジェクト情報を読み取り、オリジナルオブジェクト情報が第2オブジェクト指向
プログラムによって認識されないときはオリジナルオブジェクト情報をスキップ
し、置換オブジェクト情報を読み取るようにストリーム化オブジェクト情報に応
答するストリームリーダ関数と を具えたことを特徴とする装置。 - 【請求項2】 請求項1に記載の装置において、前記ストリームリーダ関数
は、該ストリームリーダ関数がオリジナルオブジェクト情報を認識しないときオ
リジナルオブジェクト情報を破棄するメソッドを具えたことを特徴とする装置。 - 【請求項3】 請求項1に記載の装置において、前記ストリームリーダ関数
は、該ストリームリーダ関数がオリジナルオブジェクト情報を認識しないときオ
リジナルオブジェクト情報を格納しておくメソッドを具えたことを特徴とする装
置。 - 【請求項4】 請求項3に記載の装置において、第2オブジェクトに置かれ
た第2ストリームライタ関数をさらに具え、第2ストリームライタ関数は、格納
されたオリジナルオブジェクト情報をストリーム化して、第1オブジェクト指向
プログラムに送り返す手段を具えたことを特徴とする装置。 - 【請求項5】 請求項1に記載の装置において、オリジナルオブジェクト情
報は、ベースオブジェクト情報と拡張情報を具え、ストリームライタは、ベース
オブジェクト情報が後に続く拡張情報をストリーム化する手段を具えたことを特
徴とする装置。 - 【請求項6】 請求項5に記載の装置において、ストリームリーダ関数は、
ストリームリーダ関数が拡張情報を認識しないとき拡張情報をスキップし、ベー
スオブジェクト情報を読み取る手段を具えたことを特徴とする装置。 - 【請求項7】 請求項1に記載の装置において、前記置換オブジェクト情報
は、第2オブジェクト指向プログラムによって認識される代替オブジェクトの情
報を含んでいることを特徴とする装置。 - 【請求項8】 請求項7に記載の装置において、ストリームライタ関数は、
オリジナルオブジェクト情報と代替オブジェクト情報の両方をストリーム化する
Flatten関数を具えたことを特徴とする装置。 - 【請求項9】 請求項7に記載の装置において、ストリームリーダ関数は、
ストリームリーダがオリジナルオブジェクト情報を認識するときはオリジナルオ
ブジェクト情報を再構築し、ストリームリーダがオリジナルオブジェクト情報を
認識しないときは代替オブジェクト情報を再構築するResurrect関数を具えたこ とを特徴とする装置。 - 【請求項10】 請求項1に記載の装置において、ストリームライタは、オ
ブジェクト情報への参照を収めているコンテキストオブジェクトを構築する手段
を具えたことを特徴とする装置。 - 【請求項11】 第1のフレームワークバージョンで作成された第1のオブ
ジェクト指向プログラムが、オブジェクト情報を多態的にストリーム化して、第
2のフレームワークバージョンで作成された第2のオブジェクト指向プログラム
へ渡すことを可能にする方法であって、該方法は、 (a) 第1オブジェクト指向プログラムによって認識されるオリジナルオブジ ェクト情報と第2オブジェクト指向プログラムによって認識される置換オブジェ
クト情報を、第1オブジェクト指向プログラムからストリーム化するステップと
、 (b) オリジナルオブジェクト情報が第2オブジェクト指向プログラムによっ て認識されるときは第2オブジェクト指向プログラム中のオリジナルオブジェク
ト情報を読み取るステップと、 (c) オリジナルオブジェクト情報が第2オブジェクト指向プログラムによっ て認識されないときはオリジナルオブジェクト情報をスキップし、置換オブジェ
クト情報を読み取るステップと を具えたことを特徴とする方法。 - 【請求項12】 請求項11に記載の方法において、ステップ (c) は、 (c1) ストリームリーダ関数がオリジナルオブジェクト情報を認識しないとき
オリジナルオブジェクト情報を破棄するステップ を具えたことを特徴とする方法。 - 【請求項13】 請求項11に記載の方法において、ステップ (c) は、 (c2) ストリームリーダ関数がオリジナルオブジェクト情報を認識しないとき
オリジナルオブジェクト情報を格納しておくステップ を具えたことを特徴とする方法。 - 【請求項14】 請求項13に記載の方法において、 (d) セーブされたオリジナルオブジェクト情報をストリーム化して、第1オ ブジェクト指向プログラムに送り返すステップを含んでいることを特徴とする方
法。 - 【請求項15】 請求項11に記載の方法において、オリジナルオブジェク
ト情報はベースオブジェクト情報と拡張情報を含み、ステップ (a) は、 (a1) ベースオブジェクト情報が後に続く拡張情報をストリーム化するステッ
プ を具えたことを特徴とする方法。 - 【請求項16】 請求項15に記載の方法において、ステップ (c) は、 (c3) ストリームリーダ関数が拡張情報を認識しないとき拡張情報をスキップ
し、ベースオブジェクト情報を読み取るステップ を具えたことを特徴とする方法。 - 【請求項17】 請求項11に記載の方法において、ステップ (a) は、 (a2) 第2オブジェクト指向プログラムによって認識される代替オブジェクト
の情報を置換オブジェクト情報としてストリーム化するステップ を具えたことを特徴とする方法。 - 【請求項18】 請求項17に記載の方法において、ステップ (a) は、 (a3) オリジナルオブジェクト情報と代替オブジェクト情報の両方をストリー
ム化するステップ を具えたことを特徴とする方法。 - 【請求項19】 請求項17に記載の方法において、ステップ (b) は、 (b1) ストリームリーダがオリジナルオブジェクト情報を認識するときはオリ ジナルオブジェクト情報を再構築するステップ を具え、ステップ (c) は、 (c4) ストリームリーダがオリジナルオブジェクト情報を認識しないときは代
替オブジェクト情報を再構築するステップ を具えたことを特徴とする方法。 - 【請求項20】 請求項11に記載の方法において、ステップ (a) は、 (a4) オブジェクト情報への参照を収めているコンテキストオブジェクトを構
築するステップ を具えたことを特徴とする方法。 - 【請求項21】 第1のフレームワークバージョンで作成された第1のオブ
ジェクト指向プログラムが、オブジェクト情報を多態的にストリーム化して、第
2のフレームワークバージョンで作成された第2のオブジェクト指向プログラム
へ渡すことを可能にするコンピュータプログラムプロダクトであって、該コンピ
ュータプログラムプロダクトは、コンピュータ読み取り可能なプログラムコード
がそこに格納されているコンピュータ使用可能媒体を含んでおり、前記コンピュ
ータ読み取り可能なプログラムコードは、 第1オブジェクト指向プログラムによって認識されるオリジナルオブジェクト
情報と第2オブジェクト指向プログラムによって認識される置換オブジェクト情
報をストリーム化するための第1オブジェクト指向プログラム内のプログラムコ
ードと、 オリジナルオブジェクト情報が第2オブジェクト指向プログラムによって認識
されるときにオリジナルオブジェクト情報を読み取るための第2オブジェクト指
向プログラム内のプログラムコードと、 オリジナルオブジェクト情報が第2オブジェクトプログラムによって認識され
ないときにオリジナルオブジェクト情報をスキップし、置換オブジェクト情報を
読み取るためのプログラムコードと を含むことを特徴とするコンピュータプログラムプロダクト。 - 【請求項22】 請求項21に記載のコンピュータプログラムプロダクトに
おいて、オリジナルオブジェクト情報をスキップするためのプログラムコードは
、ストリームリーダ関数がオリジナルオブジェクト情報を認識しないときオリジ
ナルオブジェクト情報を破棄するためのプログラムコードを含むことを特徴とす
るコンピュータプログラムプロダクト。 - 【請求項23】 請求項21に記載のコンピュータプログラムプロダクトに
おいて、オリジナルオブジェクト情報をスキップするプログラムコードは、スト
リームリーダ関数がオリジナルオブジェクト情報を認識しないときオリジナルオ
ブジェクト情報をセーブするプログラムコードを含んでいることを特徴とするコ
ンピュータプログラムプロダクト。 - 【請求項24】 請求項23に記載のコンピュータプログラムプロダクトに
おいて、セーブしたオリジナルオブジェクト情報をストリーム化して第1オブジ
ェクト指向プログラムに送り返すためのプログラムコードをさらに含むことを特
徴とするコンピュータプログラムプロダクト。 - 【請求項25】 請求項21に記載のコンピュータプログラムプロダクトに
おいて、オリジナルオブジェクト情報はベースオブジェクト情報と拡張情報を含
み、オリジナルオブジェクト情報と置換オブジェクト情報をストリーム化するた
めの第1オブジェクト指向プログラム中のプログラムコードは、拡張情報とその
後に続くベースオブジェクト情報をストリーム化するためのプログラムコードを
含むことを特徴とするコンピュータプログラムプロダクト。 - 【請求項26】 請求項25に記載のコンピュータプログラムプロダクトに
おいて、オリジナルオブジェクト情報をスキップするためのプログラムコードは
、ストリームリーダ関数が拡張情報を認識しないとき拡張情報をスキップし、ベ
ースオブジェクト情報を読み取るためのプログラムコードを含むことを特徴とす
るコンピュータプログラムプロダクト。 - 【請求項27】 請求項21に記載のコンピュータプログラムプロダクトに
おいて、オリジナルオブジェクト情報と置換オブジェクト情報をストリーム化す
るための第1オブジェクト指向プログラム内のプログラムコードは、第2オブジ
ェクト指向プログラムによって認識される代替オブジェクトの情報を置換オブジ
ェクト情報としてストリーム化するためのプログラムコードを含むことを特徴と
するコンピュータプログラムプロダクト。 - 【請求項28】 請求項27に記載のコンピュータプログラムプロダクトに
おいて、オリジナルオブジェクト情報と置換オブジェクト情報をストリーム化す
るための第1オブジェクト指向プログラム内のプログラムコードは、オリジナル
オブジェクト情報と代替オブジェクト情報の両方をストリーム化するためのプロ
グラムコードを含むことを特徴とするコンピュータプログラムプロダクト。 - 【請求項29】 請求項27に記載のコンピュータプログラムプロダクトに
おいて、オリジナルオブジェクト情報を読み取るためのプログラムコードは、ス
トリームリーダがオリジナルオブジェクト情報を認識するときオリジナルオブジ
ェクト情報を再構築するためのプログラムコードを含み、オリジナルオブジェク
ト情報をスキップするためのプログラムコードは、ストリームリーダがオリジナ
ルオブジェクト情報を認識しないとき代替オブジェクト情報を再構築するための
プログラムコードを含むことを特徴とするコンピュータプログラムプロダクト。 - 【請求項30】 請求項21に記載のコンピュータプログラムプロダクトに
おいて、オリジナルオブジェクト情報をストリーム化するための第1オブジェク
ト指向プログラム内のプログラムコードは、オブジェクト情報への参照を収めて
いるコンテキストオブジェクトを構築するためのプログラムコードを含むことを
特徴とするコンピュータプログラムプロダクト。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US08/986,996 | 1997-12-08 | ||
US08/986,996 US6272521B1 (en) | 1997-12-08 | 1997-12-08 | Apparatus and method for allowing object-oriented programs created with different framework versions to communicate |
PCT/US1998/025993 WO1999030226A2 (en) | 1997-12-08 | 1998-12-08 | Apparatus and method for allowing object-oriented programs created with different framework versions to communicate |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2001526421A true JP2001526421A (ja) | 2001-12-18 |
Family
ID=25532971
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2000524719A Pending JP2001526421A (ja) | 1997-12-08 | 1998-12-08 | 異なるフレームワークバージョンで作成されたオブジェクト指向プログラムが通信することを可能にする装置および方法 |
Country Status (6)
Country | Link |
---|---|
US (1) | US6272521B1 (ja) |
EP (1) | EP1038219B1 (ja) |
JP (1) | JP2001526421A (ja) |
CA (1) | CA2312814C (ja) |
DE (1) | DE69802839T2 (ja) |
WO (1) | WO1999030226A2 (ja) |
Families Citing this family (31)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7330870B1 (en) | 1997-02-11 | 2008-02-12 | International Business Machines Corporation | Streaming computer system and method with multi-version protocol compatibility |
US6412082B1 (en) * | 1997-12-17 | 2002-06-25 | Sony Corporation | Method and apparatus for selecting computer programs based on an error detection mechanism |
JP3307329B2 (ja) * | 1998-05-27 | 2002-07-24 | 日本電気株式会社 | ネットワーク構成管理対象アクセスシステム及び方法 |
US6848108B1 (en) * | 1998-06-30 | 2005-01-25 | Microsoft Corporation | Method and apparatus for creating, sending, and using self-descriptive objects as messages over a message queuing network |
US6628305B1 (en) * | 1998-11-09 | 2003-09-30 | International Business Machines Corporation | Architecture and definition of an extensible, object-oriented graphical user interface framework for managing and administering heterogenous digital library datastores |
US6477701B1 (en) * | 1999-09-30 | 2002-11-05 | Seiko Epson Corporation | Version-adaptive serialization and deserialization of program objects in an object-oriented environment |
US7016922B1 (en) * | 2000-04-27 | 2006-03-21 | Autodesk, Inc. | Intelligent object versioning |
GB2363866B (en) * | 2000-05-31 | 2002-11-06 | Intamission Ltd | Data processing apparatus, method and system |
US9622058B1 (en) | 2000-06-02 | 2017-04-11 | Timothy G. Newman | Apparatus, system, methods and network for communicating information associated with digital images |
US6877162B1 (en) * | 2000-07-31 | 2005-04-05 | Hewlett-Packard Company | Method and system for extendable class-based shared data-types |
WO2003017175A1 (en) | 2001-08-14 | 2003-02-27 | Bloomberg Lp | Distribution and mapping of financial records from data stream |
RU2348964C2 (ru) * | 2002-09-30 | 2009-03-10 | Майкрософт Корпорейшн | Система и способ для обеспечения известности элементов пользовательского интерфейса для приложения и пользователя |
US8694504B2 (en) * | 2003-03-05 | 2014-04-08 | Spore, Inc. | Methods and systems for technology analysis and mapping |
US7020666B2 (en) * | 2003-03-07 | 2006-03-28 | Microsoft Corporation | System and method for unknown type serialization |
US7404186B2 (en) * | 2003-05-28 | 2008-07-22 | Microsoft Corporation | Signature serialization |
US7386836B2 (en) * | 2003-06-09 | 2008-06-10 | International Business Machines Corporation | Maintaining multiple valid concurrent serialized object versions |
GB2409735A (en) * | 2003-12-30 | 2005-07-06 | Ibm | Method and system for change management of interfaces in distributed computer systems |
JP2007537511A (ja) * | 2004-04-30 | 2007-12-20 | マイクロソフト コーポレーション | 規則を用いたエンドユーザアプリケーションカスタマイズ |
WO2005111850A2 (en) * | 2004-04-30 | 2005-11-24 | Microsoft Corporation | End-user application customization using rules |
US7774376B1 (en) * | 2004-07-30 | 2010-08-10 | Microsoft Corporation | Type-system extensions for object-oriented language based on coercive subtyping with restrictions |
US7912863B1 (en) | 2004-07-30 | 2011-03-22 | Microsoft Corporation | Compositional lifting of operations over structural types |
US7543002B2 (en) * | 2004-12-02 | 2009-06-02 | Bea Systems, Inc. | Mechanism to load first version classes into a runtime environment running a second version of the class |
US7996443B2 (en) * | 2005-02-28 | 2011-08-09 | Microsoft Corporation | Schema grammar and compilation |
US20060195411A1 (en) * | 2005-02-28 | 2006-08-31 | Microsoft Corporation | End user data activation |
DE102005009529A1 (de) * | 2005-03-02 | 2006-09-07 | Siemens Ag | Datenverarbeitungssystem zur Integration zweier Frameworks |
US7756839B2 (en) * | 2005-03-31 | 2010-07-13 | Microsoft Corporation | Version tolerant serialization |
US7904881B2 (en) * | 2006-07-26 | 2011-03-08 | Intel Corporation | Using a virtual stack for fast and composable stack cutting |
US7801926B2 (en) | 2006-11-22 | 2010-09-21 | Microsoft Corporation | Programmable logic and constraints for a dynamically typed storage system |
US20100251212A1 (en) * | 2009-03-30 | 2010-09-30 | Microsoft Corporation | Version Type Traversal |
US8738755B2 (en) | 2011-09-09 | 2014-05-27 | International Business Machines Corporation | Providing external access to service versions via a bundle framework |
US8739187B2 (en) | 2011-09-09 | 2014-05-27 | International Business Machines Corporation | Legacy application integration within a bundle framework |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB8814630D0 (en) | 1987-11-17 | 1988-07-27 | Ibm | Dynamically adaptive environment for computer programs |
US5347653A (en) * | 1991-06-28 | 1994-09-13 | Digital Equipment Corporation | System for reconstructing prior versions of indexes using records indicating changes between successive versions of the indexes |
WO1996018947A1 (en) * | 1994-12-13 | 1996-06-20 | Novell, Inc. | Method and apparatus to update or change a network directory |
CA2171568A1 (en) | 1995-03-24 | 1996-09-25 | Peter B. Kessler | Method and system for type identification for multiple object interfaces in a distributed object environment |
US5708828A (en) * | 1995-05-25 | 1998-01-13 | Reliant Data Systems | System for converting data from input data environment using first format to output data environment using second format by executing the associations between their fields |
US6112253A (en) | 1995-10-12 | 2000-08-29 | International Business Machines Corporation | Object-oriented method maintenance mechanism that does not require cessation of the computer system or its programs |
US5745906A (en) * | 1995-11-14 | 1998-04-28 | Deltatech Research, Inc. | Method and apparatus for merging delta streams to reconstruct a computer file |
US5742818A (en) * | 1995-12-15 | 1998-04-21 | Microsoft Corporation | Method and system of converting data from a source file system to a target file system |
US5915112A (en) * | 1996-01-02 | 1999-06-22 | International Business Machines Corporation | Remote procedure interface with support for multiple versions |
US5951638A (en) * | 1997-03-21 | 1999-09-14 | International Business Machines Corporation | Integrated multimedia messaging system |
-
1997
- 1997-12-08 US US08/986,996 patent/US6272521B1/en not_active Expired - Lifetime
-
1998
- 1998-12-08 CA CA002312814A patent/CA2312814C/en not_active Expired - Lifetime
- 1998-12-08 JP JP2000524719A patent/JP2001526421A/ja active Pending
- 1998-12-08 DE DE69802839T patent/DE69802839T2/de not_active Expired - Lifetime
- 1998-12-08 WO PCT/US1998/025993 patent/WO1999030226A2/en active IP Right Grant
- 1998-12-08 EP EP98962955A patent/EP1038219B1/en not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
WO1999030226A3 (en) | 1999-07-22 |
WO1999030226A2 (en) | 1999-06-17 |
US6272521B1 (en) | 2001-08-07 |
CA2312814C (en) | 2005-06-28 |
DE69802839D1 (de) | 2002-01-17 |
DE69802839T2 (de) | 2002-08-01 |
CA2312814A1 (en) | 1999-06-17 |
EP1038219B1 (en) | 2001-12-05 |
EP1038219A2 (en) | 2000-09-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2001526421A (ja) | 異なるフレームワークバージョンで作成されたオブジェクト指向プログラムが通信することを可能にする装置および方法 | |
US5623661A (en) | System for and method of providing delta-versioning of the contents of PCTE file objects | |
US7281248B2 (en) | Virtualized and realized user interface controls | |
RU2371758C2 (ru) | Интерфейс программирования для компьютерной платформы | |
US5339406A (en) | Reconstructing symbol definitions of a dynamically configurable operating system defined at the time of a system crash | |
JP5044139B2 (ja) | 移行互換性を維持したままのジェネリック型の具体化 | |
JPH09101883A (ja) | オブジェクト指向通信フレームワーク・システム,およびオブジェクト指向プログラム・フレームワークを使用する複数のアプリケーション・プログラムの構築方法 | |
US20090319554A1 (en) | Unified metadata for external components | |
EP0786109A2 (en) | Object-oriented system for configuration history management | |
CN111736884B (zh) | 组件化方法和系统 | |
US6138272A (en) | GDMO translator, method of GDMO translation, and recording medium containing program for GDMO translator | |
US20070169011A1 (en) | Delayed loading and instantiation of resources defined in markup | |
JPH09114753A (ja) | オブジェクト指向通信システムの使用方法 | |
US20090320007A1 (en) | Local metadata for external components | |
US7197600B2 (en) | Transferring data along with code for program overlays | |
US7966600B2 (en) | Distributed resource understanding tool management | |
JP2007012064A (ja) | 非ジェネリック化方法がジェネリック化方法をオーバーライドすることの許可 | |
US20050081193A1 (en) | System and method for interacting with computer programming languages at semantic level | |
JP4806158B2 (ja) | マークアップ内でサブクラスを宣言的に定義し、使用するためのシステムおよび方法 | |
US6842905B2 (en) | Method and system for implementing collection program interface for accessing a collection of data associated with a legacy enumeration application interface | |
JP2005182562A (ja) | コンパイル方法および装置、ならびにコンパイラ | |
JP2005332146A (ja) | 動的コンテンツ作成プログラムの生成装置、動的コンテンツ作成プログラムを生成するためのプログラム、及び動的コンテンツ作成プログラムの生成方法 | |
Monnier et al. | Evolution of emacs lisp | |
US7389515B1 (en) | Application deflation system and method | |
JP5164112B2 (ja) | ソースコード変換方法、サーバシステム、およびサーバプログラム |