문서 serialization 및 스토리지Document Serialization and Storage

Microsoft .NET 프레임 워크는 고품질 문서를 만들고 표시 하기 위한 강력한 환경을 제공 합니다.Microsoft .NET Framework provides a powerful environment for creating and displaying high quality documents. 고정 문서와 유동 문서를 모두 지 원하는 고급 기능, 고급 보기 컨트롤, 강력한 2D 및 3D 그래픽 기능과 결합 된 기능을 사용 하면 응용 프로그램을 새로운 수준의 품질 및 사용자 환경으로 .NET Framework 수 있습니다.Enhanced features that support both fixed-documents and flow-documents, advanced viewing controls, combined with powerful 2D and 3D graphic capabilities take .NET Framework applications to a new level of quality and user experience. 문서의 메모리 내 표현을 유연 하 게 관리할 수 있다는 것은 .NET Framework의 핵심 기능이 며, 데이터 저장소에서 문서를 효율적으로 저장 하 고 로드 하는 것은 거의 모든 응용 프로그램에 필요 합니다.Being able to flexibly manage an in-memory representation of a document is a key feature of .NET Framework, and being able to efficiently save and load documents from a data store is a need of almost every application. 내부 메모리 내 표현에서 외부 데이터 저장소로 문서를 변환하는 프로세스를 serialization이라고 합니다.The process of converting a document from an internal in-memory representation to an external data store is termed serialization. 데이터 저장소를 읽고 원래 메모리 내 인스턴스를 다시 만드는 역프로세스는 deserialization이라고 합니다.The reverse process of reading a data store and recreating the original in-memory instance is termed deserialization.

문서 Serialization 정보About Document Serialization

원칙적으로 애플리케이션에서 문서를 메모리에서 직렬화하고 다시 메모리로 역직렬화하는 프로세스는 명확하게 수행됩니다.Ideally the process of serializing and deserializing a document from and then back into memory is transparent to the application. 애플리케이션에서는 serializer “write” 메서드를 호출하여 문서를 저장하는 한편, 역직렬 변환기 “read” 메서드는 데이터 저장소에 액세스하여 원래 인스턴스를 메모리에 다시 만듭니다.The application calls a serializer "write" method to save the document, while a deserializer "read" method accesses the data store and recreates the original instance in memory. 직렬화 및 역직렬화 프로세스를 통해 원래 양식으로 문서를 다시 만드는 경우 데이터가 저장되는 특정 형식은 일반적으로 애플리케이션에서 문제가 되지 않습니다.The specific format that the data is stored in is generally not a concern of the application as long as the serialize and deserialize process recreates the document back to its original form.

대부분의 애플리케이션에서는 사용자가 여러 다른 매체 또는 다른 형식으로 문서를 저장할 수 있도록 하는 여러 serialization 옵션을 제공합니다.Applications often provide multiple serialization options which allow the user to save documents to different medium or to a different format. 예를 들어, 애플리케이션에서 “다른 이름으로 저장” 옵션을 제공하여 문서를 디스크 파일, 데이터베이스 또는 웹 서비스에 저장하도록 지원할 수 있습니다.For example, an application might offer "Save As" options to store a document to a disk file, database, or web service. 마찬가지로 서로 다른 serializer마다 HTML, RTF, XML, XPS 등의 다른 형식 또는 타사 형식으로 문서를 저장할 수 있습니다.Similarly, different serializers could store the document in different formats such as in HTML, RTF, XML, XPS, or alternately to a third-party format. 애플리케이션에서는 serialization을 통해 각 특정 serializer의 구현 작업에서 스토리지 매체의 세부 정보를 격리하는 인터페이스를 정의합니다.To the application, serialization defines an interface that isolates the details of the storage medium within the implementation of each specific serializer. 저장소 세부 정보를 캡슐화 하는 이점 외에도 .NET Framework System.Windows.Documents.Serialization Api는 몇 가지 다른 중요 한 기능을 제공 합니다.In addition to the benefits of encapsulating storage details, the .NET Framework System.Windows.Documents.Serialization APIs provide several other important features.

.NET Framework 3.0 문서 Serializer의 기능Features of .NET Framework 3.0 Document Serializers

  • 전반적인 문서 개체(논리적 트리 및 시각적 개체)에 직접 액세스하면 페이지를 매긴 콘텐츠, 2D/3D 요소, 이미지, 매체, 하이퍼링크, 주석 및 기타 지원 콘텐츠를 효율적으로 스토리지할 수 있습니다.Direct access to the high-level document objects (logical tree and visuals) enable efficient storage of paginated content, 2D/3D elements, images, media, hyperlinks, annotations, and other support content.

  • 동기 및 비동기 작업.Synchronous and asynchronous operation.

  • 다음과 같은 고급 기능이 포함된 플러그 인 serializer 지원:Support for plug-in serializers with enhanced capabilities:

    • 모든 .NET Framework 응용 프로그램에서 사용 하는 시스템 차원 액세스입니다.System-wide access for use by all .NET Framework applications.

    • 간단한 애플리케이션 플러그 인 검색 기능.Simple application plug-in discoverability.

    • 사용자 지정 타사 플러그 인의 간단한 배포, 설치 및 업데이트.Simple deployment, installation, and update for custom third-party plug-ins.

    • 사용자 지정 런타임 설정 및 옵션에 맞는 사용자 인터페이스 지원.User interface support for custom run-time settings and options.

XPS 인쇄 경로XPS Print Path

또한 Microsoft .NET Framework XPS 인쇄 경로는 인쇄 출력을 통해 문서를 작성 하는 확장 가능한 메커니즘을 제공 합니다.The Microsoft .NET Framework XPS print path also provides an extensible mechanism for writing documents through print output. XPS는 문서 파일 형식으로 사용 되며 Windows Vista의 기본 인쇄 스풀 형식입니다.XPS serves as both a document file format and is the native print spool format for Windows Vista. 중간 형식으로 변환 하지 않아도 xps 문서를 XPS 호환 프린터로 직접 보낼 수 있습니다.XPS documents can be sent directly to XPS-compatible printers without the need for conversion to an intermediate format. 인쇄 경로 출력 옵션과 기능에 대한 추가 정보는 인쇄 개요를 참조하세요.See the Printing Overview for additional information on print path output options and capabilities.

플러그 인 SerializerPlug-in Serializers

System.Windows.Documents.Serialization Api는 응용 프로그램과 별도로 설치 되 고 런타임에 바인딩하고 SerializerProvider 검색 메커니즘을 사용 하 여 액세스 하는 플러그 인 serializer와 연결 된 serializer를 모두 지원 합니다.The System.Windows.Documents.Serialization APIs provide support for both plug-in serializers and linked serializers that are installed separately from the application, bind at run time, and are accessed by using the SerializerProvider discovery mechanism. 플러그 인 serializer는 쉽게 배포하여 시스템 전체에서 사용할 수 있는 향상된 이점을 제공합니다.Plug-in serializers offer enhanced benefits for ease of deployment and system-wide use. 플러그 인 serializer에 액세스할 수 없는 Xbap (XAML 브라우저 응용 프로그램)와 같은 부분 신뢰 환경에 대해 연결 된 serializer를 구현할 수도 있습니다.Linked serializers can also be implemented for partial trust environments such as XAML browser applications (XBAPs) where plug-in serializers are not accessible. SerializerWriter 클래스의 파생 구현을 기반으로 하는 연결 serializer는 컴파일되어 응용 프로그램에 직접 연결 됩니다.Linked serializers, which are based on a derived implementation of the SerializerWriter class, are compiled and linked directly into the application. 플러그 인 serializer와 연결된 serializer는 모두 동일한 공용 메서드와 이벤트를 통해 작동하므로 동일한 애플리케이션에서 두 serializer 유형 중 하나 또는 둘 다를 쉽게 사용할 수 있습니다.Both plug-in serializers and linked serializers operate through identical public methods and events which make it easy to use either or both types of serializers in the same application.

플러그 인 serializer는 빌드 시 가능한 모든 형식에 맞게 직접 코딩할 필요가 없는 확장된 새로운 스토리지 디자인과 파일 형식을 제공하여 애플리케이션 개발자를 지원합니다.Plug-in serializers aid application developers by providing extensibility to new storage designs and file formats without having to code directly for every potential format at build time. 플러그 인 serializer는 사용자 지정 또는 독점 파일 형식에 맞게 시스템에서 액세스 가능한 플러그 인을 배포, 설치 및 업데이트하는 표준화된 방식을 제공하여 타사 개발자에게도 이점을 제공합니다.Plug-in serializers also benefit third-party developers by providing a standardized means to deploy, install, and update system accessible plug-ins for custom or proprietary file formats.

플러그 인 Serializer 사용Using a Plug-in Serializer

플러그 인 serializer는 사용하기가 쉽습니다.Plug-in serializers are simple to use. SerializerProvider 클래스는 시스템에 설치 된 각 플러그 인에 대 한 SerializerDescriptor 개체를 열거 합니다.The SerializerProvider class enumerates a SerializerDescriptor object for each plug-in installed on the system. IsLoadable 속성은 현재 구성에 따라 설치 된 플러그 인을 필터링 하 고 직렬 변환기를 로드 하 여 응용 프로그램에서 사용할 수 있는지 확인 합니다.The IsLoadable property filters the installed plug-ins based on the current configuration and verifies that the serializer can be loaded and used by the application. 또한 SerializerDescriptor DisplayNameDefaultFileExtension와 같은 다른 속성을 제공 합니다 .이 속성은 응용 프로그램에서 사용자에 게 사용 가능한 출력 형식에 대 한 serializer를 선택 하 라는 메시지를 표시 하는 데 사용할 수 있습니다.The SerializerDescriptor also provides other properties, such as DisplayName and DefaultFileExtension, which the application can use to prompt the user in selecting a serializer for an available output format. XPS의 기본 플러그 인 serializer는 .NET Framework 제공 되며 항상 열거 됩니다.A default plug-in serializer for XPS is provided with .NET Framework and is always enumerated. 사용자가 출력 형식을 선택 하면 CreateSerializerWriter 메서드를 사용 하 여 특정 형식에 대 한 SerializerWriter를 만듭니다.After the user selects an output format, the CreateSerializerWriter method is used to create a SerializerWriter for the specific format. 그런 다음 SerializerWriter.Write 메서드를 호출 하 여 문서 스트림을 데이터 저장소에 출력할 수 있습니다.The SerializerWriter.Write method can then be called to output the document stream to the data store.

다음 예제에서는 "PlugInFileFilter" 속성에서 SerializerProvider 메서드를 사용 하는 응용 프로그램을 보여 줍니다.The following example illustrates an application that uses the SerializerProvider method in a "PlugInFileFilter" property. PlugInFileFilter는 설치 된 플러그 인을 열거 하 고 SaveFileDialog사용할 수 있는 파일 옵션을 사용 하 여 필터 문자열을 작성 합니다.PlugInFileFilter enumerates the installed plug-ins and builds a filter string with the available file options for a 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 메서드를 사용 하 여 지정 된 형식으로 지정 된 문서를 저장 하는 방법을 보여 줍니다.After an output file name has been selected by the user, the following example illustrates use of the CreateSerializerWriter method to store a given document in a specified format.

// 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;
}

플러그 인 Serializer 설치Installing Plug-in Serializers

SerializerProvider 클래스는 플러그 인 serializer 검색 및 액세스를 위한 상위 수준 응용 프로그램 인터페이스를 제공 합니다.The SerializerProvider class supplies the upper-level application interface for plug-in serializer discovery and access. SerializerProvider는 시스템에서 설치 및 액세스할 수 있는 serializer 목록을 찾아 응용 프로그램에 제공 합니다.SerializerProvider locates and provides the application a list of the serializers that are installed and accessible on the system. 설치된 serializer의 구체적인 내용은 레지스트리 설정을 통해 정의됩니다.The specifics of the installed serializers are defined through registry settings. RegisterSerializer 메서드를 사용 하 여 레지스트리에 플러그 인 serializer를 추가할 수 있습니다. 또는 .NET Framework이 아직 설치 되지 않은 경우 플러그 인 설치 스크립트는 레지스트리 값 자체를 직접 설정할 수 있습니다.Plug-in serializers can be added to the registry by using the RegisterSerializer method; or if .NET Framework is not yet installed, the plug-in installation script can directly set the registry values itself. UnregisterSerializer 메서드를 사용 하 여 이전에 설치 된 플러그 인을 제거 하거나 레지스트리 설정을 제거 스크립트와 유사 하 게 다시 설정할 수 있습니다.The UnregisterSerializer method can be used to remove a previously installed plug-in, or the registry settings can be reset similarly by an uninstall script.

플러그 인 Serializer 만들기Creating a Plug-in Serializer

플러그 인 serializer와 연결 serializer는 모두 노출된 동일한 공용 메서드와 이벤트를 사용하며, 동기식 또는 비동기식으로 작동하도록 비슷하게 설계될 수 있습니다.Both plug-in serializers and linked serializers use the same exposed public methods and events, and similarly can be designed to operate either synchronously or asynchronously. 일반적으로 플러그 인 serializer를 만들기 위해 수행하는 기본 단계는 다음 세 가지입니다.There are three basic steps normally followed to create a plug-in serializer:

  1. 먼저 serializer를 연결 serializer로 구현하고 디버깅합니다.Implement and debug the serializer first as a linked serializer. 처음에 테스트 애플리케이션에서 직접 컴파일 및 연결된 serializer를 만들면 테스트에 유용한 중단점 및 기타 디버그 서비스에 완벽하게 액세스할 수 있습니다.Initially creating the serializer compiled and linked directly in a test application provides full access to breakpoints and other debug services helpful for testing.

  2. 직렬 변환기를 완전히 테스트 한 후에는 플러그 인을 만들기 위해 ISerializerFactory 인터페이스가 추가 됩니다.After the serializer is fully tested, an ISerializerFactory interface is added to create a plug-in. ISerializerFactory 인터페이스는 논리적 트리, UIElement 개체, IDocumentPaginatorSourceVisual 요소를 포함 하는 모든 .NET Framework 개체에 대 한 모든 액세스를 허용 합니다.The ISerializerFactory interface permits full access to all .NET Framework objects which includes the logical tree, UIElement objects, IDocumentPaginatorSource, and Visual elements. 또한 ISerializerFactory는 연결 된 serializer에서 사용 되는 것과 동일한 동기 및 비동기 메서드 및 이벤트를 제공 합니다.Additionally ISerializerFactory provides the same synchronous and asynchronous methods and events used by linked serializers. 큰 문서는 출력하는 데 시간이 걸리므로, 비동기 작업을 통해 반응이 빠른 사용자 조작을 유지 관리하고 데이터 저장소에 문제가 발생하면 “취소” 옵션을 제공하는 것이 좋습니다.Since large documents can take time to output, asynchronous operations are recommended to maintain responsive user interaction and offer a "Cancel" option if some problem occurs with the data store.

  3. 플러그 인 serializer가 만들어지면 플러그 인을 배포하고 설치(및 제거)하기 위한 설치 스크립트가 구현됩니다(위의 “플러그 인 Serializer 설치” 참조).After the plug-in serializer is created, an installation script is implemented for distributing and installing (and uninstalling) the plug-in (see above, "Installing Plug-in Serializers").

참조See also