次の方法で共有


ドキュメントのシリアル化とストレージ

Microsoft .NET Framework は、高品質のドキュメントを作成して表示するための強力な環境を提供します。 固定ドキュメントとフロー ドキュメントの両方をサポートする強化された機能、高度な表示コントロール、強力な 2D および 3D グラフィック機能を組み合わせることで、.NET Framework アプリケーションは新しいレベルの品質とユーザー エクスペリエンスを実現します。 ドキュメントのメモリ内表現を柔軟に管理できることは、.NET Framework の重要な機能であり、データ ストアからドキュメントを効率的に保存して読み込むことが、ほぼすべてのアプリケーションのニーズです。 ドキュメントを内部メモリ内表現から外部データ ストアに変換するプロセスは、シリアル化と呼ばれます。 データ ストアを読み取り、元のメモリ内インスタンスを再作成する逆プロセスは、逆シリアル化と呼びます。

ドキュメントのシリアル化について

理想的には、ドキュメントをシリアル化してメモリに逆シリアル化するプロセスは、アプリケーションに対して透過的です。 アプリケーションはシリアライザーの "書き込み" メソッドを呼び出してドキュメントを保存しますが、逆シリアライザーの "読み取り" メソッドはデータ ストアにアクセスし、メモリ内の元のインスタンスを再作成します。 シリアル化および逆シリアル化プロセスがドキュメントを元の形式に再作成する限り、データが格納される特定の形式は、通常、アプリケーションの問題ではありません。

多くの場合、アプリケーションには複数のシリアル化オプションが用意されています。これにより、ユーザーはドキュメントを異なるメディアまたは別の形式に保存できます。 たとえば、アプリケーションでは、ディスク ファイル、データベース、または Web サービスにドキュメントを格納するための [名前を付けて保存] オプションが提供される場合があります。 同様に、異なるシリアライザーは、HTML、RTF、XML、XPS などの異なる形式でドキュメントを格納したり、サードパーティの形式に代わりに保存したりできます。 アプリケーションに対して、シリアル化は、各特定のシリアライザーの実装内でストレージ メディアの詳細を分離するインターフェイスを定義します。 .NET Framework System.Windows.Documents.Serialization API には、ストレージの詳細をカプセル化する利点に加えて、他にもいくつかの重要な機能が用意されています。

.NET Framework 3.0 ドキュメント シリアライザーの機能

  • 高度なドキュメント オブジェクト (論理ツリーとビジュアル) に直接アクセスすると、ページ分割されたコンテンツ、2D/3D 要素、画像、メディア、ハイパーリンク、注釈、およびその他のサポート コンテンツを効率的に保存できます。

  • 同期操作と非同期操作。

  • 強化された機能を備えたプラグイン シリアライザーのサポート:

    • すべての .NET Framework アプリケーションで使用するためのシステム全体のアクセス。

    • 単純なアプリケーション プラグインの検出可能性。

    • カスタムサードパーティプラグインの簡単な展開、インストール、更新。

    • カスタムランタイム設定とオプションに対するユーザー インターフェイスのサポート。

XPS 印刷パス

Microsoft .NET Framework XPS の印刷パスには、印刷出力を介してドキュメントを書き込むための拡張可能なメカニズムも用意されています。 XPS は、ドキュメント ファイル形式の両方として機能し、Windows Vista のネイティブ印刷スプール形式です。 XPS ドキュメントは、中間形式への変換を必要とせずに、XPS 互換プリンターに直接送信できます。 印刷パスの出力オプションと機能の詳細については、「印刷の概要」 を参照してください。

プラグイン シリアライザー

System.Windows.Documents.Serialization API は、アプリケーションとは別にインストールされ、実行時にバインドされ、SerializerProvider 検出メカニズムを使用してアクセスされる、プラグイン シリアライザーとリンクされたシリアライザーの両方をサポートします。 プラグイン シリアライザーは、展開とシステム全体の使用を容易にするための強化された利点を提供します。 リンクされたシリアライザーは、プラグイン シリアライザーにアクセスできない XAML ブラウザー アプリケーション (XBAP) などの部分信頼環境にも実装できます。 リンクされたシリアライザーは、SerializerWriter クラスの派生実装に基づいてコンパイルされ、アプリケーションに直接リンクされます。 プラグイン シリアライザーとリンクされたシリアライザーの両方が、同じパブリック メソッドとイベントを介して動作するため、同じアプリケーションでどちらかまたは両方の種類のシリアライザーを簡単に使用できます。

プラグイン シリアライザーは、ビルド時にすべての潜在的な形式に対して直接コーディングすることなく、新しいストレージ設計とファイル形式の拡張性を提供することで、アプリケーション開発者を支援します。 また、プラグイン シリアライザーは、カスタムまたは独自のファイル形式のシステム アクセス可能なプラグインを展開、インストール、更新するための標準化された手段を提供することで、サード パーティの開発者にも役立ちます。

プラグイン シリアライザーの使用

プラグイン シリアライザーは簡単に使用できます。 SerializerProvider クラスは、システムにインストールされている各プラグインの SerializerDescriptor オブジェクトを列挙します。 IsLoadable プロパティは、現在の構成に基づいてインストールされているプラグインをフィルター処理し、シリアライザーを読み込んでアプリケーションで使用できることを確認します。 SerializerDescriptor には、DisplayNameDefaultFileExtensionなどの他のプロパティも用意されています。このプロパティを使用すると、アプリケーションは、シリアライザーで使用可能な出力形式を選択するようにユーザーに求めることができます。 XPS の既定のプラグイン シリアライザーは.NET Framework で提供され、常に列挙されます。 ユーザーが出力形式を選択すると、CreateSerializerWriter メソッドを使用して、特定の形式の SerializerWriter が作成されます。 その後、SerializerWriter.Write メソッドを呼び出して、ドキュメント ストリームをデータ ストアに出力できます。

次の例は、"PlugInFileFilter" プロパティで SerializerProvider メソッドを使用するアプリケーションを示しています。 PlugInFileFilter は、インストールされているプラグインを列挙し、SaveFileDialogで使用可能なファイル オプションを含むフィルター文字列を構築します。

// ------------------------ PlugInFileFilter --------------------------
/// <summary>
///   Gets a filter string for installed plug-in serializers.</summary>
/// <remark>
///   PlugInFileFilter is used to set the SaveFileDialog or
///   OpenFileDialog "Filter" property when saving or opening files
///   using plug-in serializers.</remark>
private string PlugInFileFilter
{
    get
    {   // Create a SerializerProvider for accessing plug-in serializers.
        SerializerProvider serializerProvider = new SerializerProvider();
        string filter = "";

        // For each loadable serializer, add its display
        // name and extension to the filter string.
        foreach (SerializerDescriptor serializerDescriptor in
            serializerProvider.InstalledSerializers)
        {
            if (serializerDescriptor.IsLoadable)
            {
                // After the first, separate entries with a "|".
                if (filter.Length > 0)   filter += "|";

                // Add an entry with the plug-in name and extension.
                filter += serializerDescriptor.DisplayName + " (*" +
                    serializerDescriptor.DefaultFileExtension + ")|*" +
                    serializerDescriptor.DefaultFileExtension;
            }
        }

        // Return the filter string of installed plug-in serializers.
        return filter;
    }
}

ユーザーが出力ファイル名を選択した後、次の例は、CreateSerializerWriter メソッドを使用して指定した形式で指定されたドキュメントを格納する方法を示しています。

// Create a SerializerProvider for accessing plug-in serializers.
SerializerProvider serializerProvider = new SerializerProvider();

// Locate the serializer that matches the fileName extension.
SerializerDescriptor selectedPlugIn = null;
foreach ( SerializerDescriptor serializerDescriptor in
                serializerProvider.InstalledSerializers )
{
    if ( serializerDescriptor.IsLoadable &&
         fileName.EndsWith(serializerDescriptor.DefaultFileExtension) )
    {   // The plug-in serializer and fileName extensions match.
        selectedPlugIn = serializerDescriptor;
        break; // foreach
    }
}

// If a match for a plug-in serializer was found,
// use it to output and store the document.
if (selectedPlugIn != null)
{
    Stream package = File.Create(fileName);
    SerializerWriter serializerWriter =
        serializerProvider.CreateSerializerWriter(selectedPlugIn,
                                                  package);
    IDocumentPaginatorSource idoc =
        flowDocument as IDocumentPaginatorSource;
    serializerWriter.Write(idoc.DocumentPaginator, null);
    package.Close();
    return true;
}

プラグイン シリアライザーのインストール

SerializerProvider クラスは、プラグイン シリアライザーの検出とアクセスのための上位レベルのアプリケーション インターフェイスを提供します。 SerializerProvider、システムにインストールされ、アクセス可能なシリアライザーの一覧をアプリケーションに提供します。 インストールされているシリアライザーの詳細は、レジストリ設定によって定義されます。 プラグイン シリアライザーは、RegisterSerializer メソッドを使用してレジストリに追加できます。または、.NET Framework がまだインストールされていない場合は、プラグイン インストール スクリプトでレジストリ値自体を直接設定できます。 UnregisterSerializer メソッドを使用して、以前にインストールしたプラグインを削除することも、アンインストール スクリプトを使用してレジストリ設定を同様にリセットすることもできます。

プラグイン シリアライザーの作成

プラグイン シリアライザーとリンク シリアライザーはどちらも、公開されている同じパブリック メソッドとイベントを使用します。同様に、同期的または非同期的に動作するように設計できます。 プラグイン シリアライザーを作成するには、通常、次の 3 つの基本的な手順に従います。

  1. まず、リンクされたシリアライザーとしてシリアライザーを実装してデバッグします。 最初に、テスト アプリケーションでコンパイルおよびリンクされたシリアライザーを作成すると、テストに役立つブレークポイントやその他のデバッグ サービスへのフル アクセスが提供されます。

  2. シリアライザーが完全にテストされると、ISerializerFactory インターフェイスが追加され、プラグインが作成されます。 ISerializerFactory インターフェイスでは、論理ツリー、UIElement オブジェクト、IDocumentPaginatorSource、および Visual 要素を含むすべての .NET Framework オブジェクトへのフル アクセスが許可されます。 さらに、ISerializerFactory は、リンクされたシリアライザーで使用されるのと同じ同期メソッドと非同期メソッドとイベントを提供します。 大規模なドキュメントの出力には時間がかかる可能性があるため、非同期操作は、応答性の高いユーザー操作を維持し、データ ストアで何らかの問題が発生した場合に "キャンセル" オプションを提供することをお勧めします。

  3. プラグイン シリアライザーが作成されると、プラグインの配布とインストール (およびアンインストール) 用のインストール スクリプトが実装されます (上記の「プラグイン シリアライザーのインストール」参照)。

こちらも参照ください