次の方法で共有


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

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

このトピックは、次のセクションで構成されています。

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

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

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

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

.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 browser applications (XBAPs) などの部分信頼環境にも実装できます。 リンクされたシリアライザーは、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. プラグイン シリアライザーを作成したら、プラグインの配布、インストール、およびアンインストールのためのインストール スクリプトを実装します (前の「プラグイン シリアライザーのインストール」を参照してください)。

参照

参照

System.Windows.Documents.Serialization

XpsDocumentWriter

XpsDocument

概念

WPF のドキュメント

印刷の概要

その他の技術情報

XML Paper Specification: 概要