XamlServices는 XAML 노드 스트림 또는 이러한 노드에서 얻은 XAML 형식 시스템 정보에 대한 특정 액세스 권한이 필요하지 않은 XAML 시나리오를 처리하는 데 사용할 수 있는 .NET Framework XAML 서비스에서 제공하는 클래스입니다. XamlServices API는 XAML 로드 경로를 지원하기 위한 Load 또는 Parse, XAML 저장 경로를 지원하기 위한 Save 및 로드 경로와 저장 경로를 조인하는 기술을 제공하는 Transform으로 요약할 수 있습니다. Transform을 사용하여 한 XAML 스키마에서 다른 XAML 스키마로 변경할 수 있습니다. 이 항목에서는 이러한 각 API 분류를 요약하고 특정 메서드 오버로드 간의 차이에 대해 설명합니다.
이 항목에는 다음 단원이 포함되어 있습니다.
- 로드
- Parse
- 저장
- Transform
- 관련 항목
로드
Load의 다양한 오버로드가 로드 경로에 대한 완전한 논리를 구현합니다. 로드 경로는 일정한 형태의 XAML을 사용하고 XAML 노드 스트림을 출력합니다. 이러한 로드 경로는 대부분 인코딩된 XML 텍스트 파일 형태로 XAML을 사용합니다. 그러나 일반 스트림을 로드하거나 이미 다른 XamlReader 구현에 포함된 미리 로드된 XAML 소스를 로드할 수도 있습니다.
대부분의 시나리오를 위한 가장 간단한 오버로드는 Load(String)입니다. 이 오버로드에는 로드할 XAML을 포함하는 텍스트 파일의 이름인 fileName 매개 변수가 있습니다. 이 시그니처는 로컬 컴퓨터에 대해 이전에 serialize된 상태 또는 데이터를 가진 완전 신뢰 응용 프로그램과 같은 응용 프로그램 시나리오에 적합합니다. 또한 응용 프로그램 모델을 정의하는 중이고 응용 프로그램 동작, 시작 UI 또는 XAM을 사용하는 기타 프레임워크 정의 기능을 정의하는 표준 파일 중 하나를 로드하려는 경우에 유용합니다.
Load(Stream)에는 비슷한 시나리오가 있습니다. 이 오버로드는 파일 시스템에 액세스할 수 있는 다른 System.IO API에서 Stream이 자주 출력되기 때문에 로드할 사용자 선택 파일이 있는 경우 유용할 수 있습니다. 또는 비동기 다운로드 또는 마찬가지로 스트림을 제공하는 기타 네트워크 기술을 통해 XAML 소스에 액세스할 수 있습니다. 스트림이나 사용자가 선택한 소스에서 로드할 경우 보안 문제가 발생할 수 있습니다. 자세한 내용은 XAML 보안 고려 사항를 참조하십시오.
Load(TextReader) 및 Load(XmlReader)는 이전 버전의 .NET Framework에 있는 형식의 판독기에 의존하는 오버로드입니다. 이러한 오버로드를 사용하려면 판독기 인스턴스를 만들고 해당 Create API를 사용하여 적절한 형태(텍스트 또는 XML)로 XAML을 로드해야 합니다. 이미 다른 판독기에서 레코드 포인터를 이동했거나 레코드 포인터를 사용하여 다른 작업을 수행한 경우에는 상관이 없습니다. Load의 로드 경로 논리는 항상 루트에서 아래로의 전체 XAML 입력을 처리합니다. 이러한 오버로드에 대한 시나리오에는 다음이 포함될 수 있습니다.
기존 XML 관련 텍스트 편집기의 간단한 XAML 편집 기능을 제공하는 디자인 화면
전용 판독기를 사용하여 파일 또는 스트림을 여는 변형된 핵심 System.IO 시나리오. XAML로 로드하기 전에 콘텐츠의 기본적인 검사 또는 처리가 논리에서 수행됩니다.
파일 또는 스트림을 로드하거나 해당 판독기의 API를 통해 로드하여 XAML 입력을 래핑하는 XmlReader, TextReader 또는 XamlReader를 로드할 수 있습니다.
내부적으로 앞의 각 오버로드는 최종적으로는 Load(XmlReader)이며, 전달된 XmlReader는 새 XamlXmlReader를 만드는 데 사용됩니다.
고급 시나리오를 위해 제공되는 Load 시그니처는 Load(XamlReader)입니다. 다음 경우 중 하나에 이 시그니처를 사용할 수 있습니다.
고유한 XamlReader 구현을 정의했습니다.
기본 설정과 다른 XamlReader에 대한 설정을 지정해야 합니다.
기본 설정이 아닌 경우의 예로는 AllowProtectedMembersOnRoot, BaseUri, IgnoreUidsOnPropertyElements, LocalAssembly, ValuesMustBeString 등을 설정하는 경우를 들 수 있습니다. XamlServices의 기본 판독기는 XamlXmlReader입니다. 설정과 함께 고유한 XamlXmlReader를 제공할 경우 CloseInput, SkipXmlCompatibilityProcessing, XmlLang, XmlSpacePreserve 속성에서 기본이 아닌 XamlXmlReaderSettings를 설정합니다.
Parse
Parse는 XAML 입력에서 XAML 노드 스트림을 만드는 로드 경로 API이므로 Load와 같습니다. 그러나 이 경우 XAML 입력은 로드할 모든 XAML을 포함하는 문자열로 직접 제공됩니다. Parse는 프레임워크 시나리오보다 응용 프로그램 시나리오에 더 적합한 방법입니다. 자세한 내용은 Parse를 참조하십시오. 실제로 Parse는 내부적으로 StringReader를 포함하는 래핑된 Load(XmlReader) 호출입니다.
저장
Save의 다양한 오버로드는 저장 경로를 구현합니다. 모든 Save 메서드는 개체 그래프를 입력으로 사용하며 출력을 스트림, 파일 또는 XmlWriter/TextWriter 인스턴스로 생성합니다.
입력 개체는 일정한 개체 표현의 루트 개체여야 합니다. 이는 비즈니스 개체의 단일 루트, UI 시나리오의 페이지에 대한 개체 트리의 루트, 디자인 도구의 작업 편집 화면, 시나리오에 적합한 다른 루트 개체 개념 등일 수 있습니다.
대부분의 시나리오에서 저장한 개체 트리는 Load 또는 프레임워크/응용 프로그램 모델이 구현하는 기타 API를 사용하여 XAML을 로드한 원래 작업과 관련이 있습니다. 상태 변경 사항, 응용 프로그램이 사용자로부터 런타임 설정을 캡처한 위치 관련 변경 사항, 응용 프로그램이 XAML 디자인 화면이기 때문에 변경된 XAML 등으로 인해 개체 트리에서 차이점이 캡처될 수 있습니다. 변경 사항이 있는지 여부에 상관없이 처음에 태그에서 XAML을 로드하여 다시 저장한 다음 두 개의 XAML 태그 형식을 비교하는 작업의 개념을 XAML의 라운드트립 표현이라고 하기도 합니다.
태그 형식으로 설정된 복잡한 개체를 저장 및 serialize할 경우 정보 손실 없는 완전한 표현도 중요하지만 표현이 지나치게 자세해서 XAML의 가독성을 떨어뜨릴 정도가 되지 않도록 하는 것도 중요합니다. 또한 XAML의 여러 다른 고객은 이러한 균형을 이루는 방법에 대한 정의나 기대치가 다를 수 있습니다. Save API는 이러한 균형에 대한 한 가지 정의를 나타냅니다. Save API는 XamlType, XamlMember 및 기타 XAML 내장 항목 및 XAML 형식 시스템 개념의 기본 CLR 기반 특징과 사용 가능한 XAML 스키마 컨텍스트를 사용하여 특정 XAML 노드 스트림 구문을 태그에 다시 저장할 때 최적화할 수 있는 부분을 결정합니다. 예를 들어 XamlServices 저장 경로는 CLR 기반 기본 XAML 스키마 컨텍스트를 사용하여 개체의 XamlType을 확인하고 XamlType.ContentProperty를 결정한 다음 해당 개체의 XAML 콘텐츠에 속성을 기록할 때 속성 요소 태그를 생략할 수 있습니다.
Transform
Transform은 로드 경로 및 저장 경로를 단일 작업으로 연결하여 XAML을 변환합니다. 다른 스키마 컨텍스트 또는 다른 지원 형식 시스템을 XamlReader 및 XamlWriter에 사용하여 결과 XAML이 변환되는 방법에 영향을 줄 수 있습니다. 이는 광범위한 변환 작업에 적용됩니다.
XAML 노드 스트림의 각 노드를 검사하는 데 의존하는 작업의 경우 일반적으로 Transform을 사용하지 않습니다. 대신에 고유한 일련의 로드 경로-저장 경로 작업을 정의하고 고유한 논리를 삽입해야 합니다. 경로 중 하나에서 고유한 노드 루프 주위에 XAML 판독기/XAML 작성기 쌍을 사용합니다. 예를 들어 XamlXmlReader를 사용하여 초기 XAML을 로드하고 연속적인 Read 호출로 노드를 한 단계씩 실행합니다. XAML 노드 스트림 수준에서 작업하는 경우 개별 노드(형식, 멤버, 기타 노드)를 조정하여 변환을 적용하거나 노드를 그대로 둘 수 있습니다. 그런 다음 계속해서 XamlObjectWriter의 관련 Write API에 노드를 보내고 개체를 기록합니다. 자세한 내용은 XAML 노드 스트림 구조 및 개념 이해를 참조하십시오.