Share via


ドキュメントのシリアル化および保存

更新 : 2007 年 11 月

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

このトピックには次のセクションが含まれています。

  • ドキュメントのシリアル化について
  • プラグイン シリアライザ
  • 関連トピック

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

理想的には、メモリ内のドキュメントをシリアル化および逆シリアル化してメモリに戻すプロセスは、アプリケーションから透過的に実行されます。アプリケーションは、シリアライザの "write" メソッドを呼び出してドキュメントを保存します。一方、デシリアライザの "read" メソッドは、データ ストアにアクセスして元のインスタンスをメモリ内に再作成します。シリアル化および逆シリアル化によってドキュメントが元の形式に再作成される限り、通常、データの特定の保存形式はアプリケーションにとって重要ではありません。

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

.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 オブジェクト、IDocumentPaginatorSourceVisual 要素などすべての .NET Framework オブジェクトへの完全なアクセスが許可されます。さらに、ISerializerFactory は、リンクされたシリアライザによって使用される同一の同期および非同期のメソッドとイベントを提供します。サイズの大きいドキュメントは出力に時間がかかる場合があるので、ユーザー操作の応答性を維持するために非同期操作を使用するようお勧めします。また、データ ストアになんらかの問題が発生した場合に備えて "キャンセル" オプションを用意してください。

  3. プラグイン シリアライザを作成したら、プラグインの配布、インストール、およびアンインストールのためのインストール スクリプトを実装します (上記の「プラグイン シリアライザのインストール」を参照してください)。

参照

処理手順

XPS ドキュメントの印刷

ドキュメントのシリアル化のサンプル

概念

Windows Presentation Foundation のドキュメント

印刷の概要

参照

System.Windows.Documents.Serialization

XpsDocumentWriter

XpsDocument

その他の技術情報

XPS