문서 serialization 및 스토리지

Microsoft .NET Framework는 고품질 문서를 만들고 표시하기 위한 강력한 환경을 제공합니다. 고정 문서 및 유동 문서, 고급 보기 컨트롤을 모두 지원하는 고급 기능은 강력한 2D 및 3D 그래픽 기능과 결합되어 .NET Framework 애플리케이션의 품질과 사용자 환경을 향상시킵니다. 문서의 메모리 내 표현을 유연하게 관리할 수 있는 기능은 .NET Framework의 주요 기능 중 하나이며, 대부분의 애플리케이션에서 데이터 저장소의 문서를 효율적으로 저장하고 로드하는 기능을 필요로 합니다. 내부 메모리 내 표현에서 외부 데이터 저장소로 문서를 변환하는 프로세스를 serialization이라고 합니다. 데이터 저장소를 읽고 원래 메모리 내 인스턴스를 다시 만드는 역프로세스는 deserialization이라고 합니다.

문서 Serialization 정보

원칙적으로 애플리케이션에서 문서를 메모리에서 직렬화하고 다시 메모리로 역직렬화하는 프로세스는 명확하게 수행됩니다. 애플리케이션에서는 serializer “write” 메서드를 호출하여 문서를 저장하는 한편, 역직렬 변환기 “read” 메서드는 데이터 저장소에 액세스하여 원래 인스턴스를 메모리에 다시 만듭니다. 직렬화 및 역직렬화 프로세스를 통해 원래 양식으로 문서를 다시 만드는 경우 데이터가 저장되는 특정 형식은 일반적으로 애플리케이션에서 문제가 되지 않습니다.

대부분의 애플리케이션에서는 사용자가 여러 다른 매체 또는 다른 형식으로 문서를 저장할 수 있도록 하는 여러 serialization 옵션을 제공합니다. 예를 들어, 애플리케이션에서 “다른 이름으로 저장” 옵션을 제공하여 문서를 디스크 파일, 데이터베이스 또는 웹 서비스에 저장하도록 지원할 수 있습니다. 마찬가지로 서로 다른 serializer마다 HTML, RTF, XML, XPS 등의 다른 형식 또는 타사 형식으로 문서를 저장할 수 있습니다. 애플리케이션에서는 serialization을 통해 각 특정 serializer의 구현 작업에서 스토리지 매체의 세부 정보를 격리하는 인터페이스를 정의합니다. .NET Framework System.Windows.Documents.Serialization API는 스토리지 세부 정보를 캡슐화하는 이점 외에도 몇 가지 다른 중요한 기능을 제공합니다.

.NET Framework 3.0 문서 Serializer의 기능

  • 전반적인 문서 개체(논리적 트리 및 시각적 개체)에 직접 액세스하면 페이지를 매긴 콘텐츠, 2D/3D 요소, 이미지, 매체, 하이퍼링크, 주석 및 기타 지원 콘텐츠를 효율적으로 스토리지할 수 있습니다.

  • 동기 및 비동기 작업.

  • 다음과 같은 고급 기능이 포함된 플러그 인 serializer 지원:

    • 모든 .NET Framework 애플리케이션에서 사용하는 시스템 차원 액세스.

    • 간단한 애플리케이션 플러그 인 검색 기능.

    • 사용자 지정 타사 플러그 인의 간단한 배포, 설치 및 업데이트.

    • 사용자 지정 런타임 설정 및 옵션에 맞는 사용자 인터페이스 지원.

XPS 인쇄 경로

Microsoft .NET Framework XPS 인쇄 경로에서는 인쇄 출력을 통해 문서를 작성하기 위한 확장 가능 메커니즘도 제공합니다. XPS는 문서 파일 형식으로 사용되며 Windows Vista의 원시 인쇄 스풀 형식이기도 합니다. 중간 형식으로 변환하지 않아도 XPS 문서를 XPS 호환 프린터로 직접 보낼 수 있습니다. 인쇄 경로 출력 옵션과 기능에 대한 추가 정보는 인쇄 개요를 참조하세요.

플러그 인 Serializer

System.Windows.Documents.Serialization API는 애플리케이션과는 별도로 설치된 연결 serializer와 플러그 인 serializer를 모두 지원하며, 런타임 시 바인딩되고, SerializerProvider 검색 메커니즘을 사용하여 액세스됩니다. 플러그 인 serializer는 쉽게 배포하여 시스템 전체에서 사용할 수 있는 향상된 이점을 제공합니다. 플러그 인 serializer에 액세스할 수 없는 XBAP(XAML 브라우저 애플리케이션) 등의 부분 신뢰 환경용으로도 연결된 serializer를 구현할 수 있습니다. 파생된 SerializerWriter 클래스 구현을 기반으로 하는 연결 serializer는 컴파일된 다음, 애플리케이션에 직접 연결됩니다. 플러그 인 serializer와 연결된 serializer는 모두 동일한 공용 메서드와 이벤트를 통해 작동하므로 동일한 애플리케이션에서 두 serializer 유형 중 하나 또는 둘 다를 쉽게 사용할 수 있습니다.

플러그 인 serializer는 빌드 시 가능한 모든 형식에 맞게 직접 코딩할 필요가 없는 확장된 새로운 스토리지 디자인과 파일 형식을 제공하여 애플리케이션 개발자를 지원합니다. 플러그 인 serializer는 사용자 지정 또는 독점 파일 형식에 맞게 시스템에서 액세스 가능한 플러그 인을 배포, 설치 및 업데이트하는 표준화된 방식을 제공하여 타사 개발자에게도 이점을 제공합니다.

플러그 인 Serializer 사용

플러그 인 serializer는 사용하기가 쉽습니다. SerializerProvider 클래스는 시스템에 설치된 각 플러그 인에 대한 SerializerDescriptor 개체를 열거합니다. IsLoadable 속성은 현재 구성을 기반으로 설치된 플러그 인을 필터링하며, serializer를 애플리케이션에서 로드하고 사용할 수 있는지 확인합니다. SerializerDescriptorDisplayNameDefaultFileExtension과 같은 다른 속성도 제공합니다. 애플리케이션은 이 속성을 사용하여 사용 가능한 출력 형식에 대한 serializer를 선택하라는 메시지를 사용자에게 표시할 수 있습니다. XPS의 기본 플러그 인 serializer는 .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;
}

플러그 인 Serializer 설치

SerializerProvider 클래스는 플러그 인 serializer 검색 및 액세스용으로 상위 수준 애플리케이션 인터페이스를 제공합니다. SerializerProvider는 시스템에 설치되어 액세스 가능한 serializer의 목록을 찾아 애플리케이션에 제공합니다. 설치된 serializer의 구체적인 내용은 레지스트리 설정을 통해 정의됩니다. 플러그 인 serializer는 RegisterSerializer 메서드를 사용하여 레지스트리에 추가할 수 있습니다. 또는 .NET Framework가 아직 설치되지 않은 경우 플러그 인 설치 스크립트에서 직접 레지스트리 값을 설정할 수 있습니다. UnregisterSerializer 메서드를 사용하여 이전에 설치한 플러그 인을 제거하거나, 제거 스크립트를 사용하여 레지스트리 설정을 비슷하게 재설정할 수 있습니다.

플러그 인 Serializer 만들기

플러그 인 serializer와 연결 serializer는 모두 노출된 동일한 공용 메서드와 이벤트를 사용하며, 동기식 또는 비동기식으로 작동하도록 비슷하게 설계될 수 있습니다. 일반적으로 플러그 인 serializer를 만들기 위해 수행하는 기본 단계는 다음 세 가지입니다.

  1. 먼저 serializer를 연결 serializer로 구현하고 디버깅합니다. 처음에 테스트 애플리케이션에서 직접 컴파일 및 연결된 serializer를 만들면 테스트에 유용한 중단점 및 기타 디버그 서비스에 완벽하게 액세스할 수 있습니다.

  2. Serializer가 완전히 테스트되고 나면 플러그 인을 만들기 위해 ISerializerFactory 인터페이스가 추가됩니다. ISerializerFactory 인터페이스는 논리 트리, UIElement 개체, IDocumentPaginatorSourceVisual 요소를 포함하는 모든 .NET Framework 개체에 대한 전체 액세스를 허용합니다. 또한 ISerializerFactory는 연결 serializer에서 사용하는 동일한 동기 및 비동기 메서드와 이벤트를 제공합니다. 큰 문서는 출력하는 데 시간이 걸리므로, 비동기 작업을 통해 반응이 빠른 사용자 조작을 유지 관리하고 데이터 저장소에 문제가 발생하면 “취소” 옵션을 제공하는 것이 좋습니다.

  3. 플러그 인 serializer가 만들어지면 플러그 인을 배포하고 설치(및 제거)하기 위한 설치 스크립트가 구현됩니다(위의 “플러그 인 Serializer 설치” 참조).

참고 항목