XamlWriter.Save의 serialization 제한

API Save를 사용하여 WPF(Windows Presentation Foundation) 애플리케이션의 콘텐츠를 XAML(Extensible Application Markup Language) 파일로 serialize할 수 있습니다. 하지만 정확히 serialize되는 항목에 대한 눈에 띄는 몇 가지 제한 사항이 있습니다. 이러한 제한 사항과 몇몇 일반적인 고려 사항은 이 항목에서 설명합니다.

런타임으로, 디자인 타임 표현이 아님

Save에 대한 호출로 serialize된 항목에 대한 기본 원칙은 런타임 시 serialize되는 개체를 나타내는 것입니다. 원래 XAML 파일의 많은 디자인 타임 속성은 이미 XAML이 메모리 내 개체로 로드되는 시간까지 최적화되거나 손실되었을 수 있고 serialize할 Save를 호출할 때 유지되지 않습니다. serialize된 결과는 생성된 애플리케이션 논리 트리의 효과적인 표현이지만 논리 트리를 생성한 원래 XAML에는 효과적인 표현이 아닐 수 있습니다. 이러한 문제로 인해 Save serialization을 광범위한 XAML 디자인 화면의 일부로 사용하는 것이 매우 어렵습니다.

Serialization은 자체 포함됨

Save의 serialize된 출력은 자체 포함됩니다. 단일 루트 요소가 있고 URI 외의 외부 참조가 없는 XAML 단일 페이지에 serialize된 모든 것이 포함됩니다. 예를 들어 페이지에서 애플리케이션 리소스의 리소스를 참조한 경우 리소스는 serialize되는 페이지의 구성 요소인 것처럼 표시됩니다.

확장 참조가 역참조됨

StaticResource 또는 Binding과 같은 다양한 태그 확장 서식으로 만들어진 개체에 대한 일반 참조는 serialization 프로세스에서 역참조됩니다. 이러한 참조는 이미 메모리 내 개체가 애플리케이션 런타임을 통해 만들어진 시점에 역참조되었고 Save 논리는 해당 참조를 serialize된 출력으로 복원하기 위해 원래 XAML을 재방문하지 않습니다. 이로 인해 데이터 바인딩된 값이나 리소스에서 얻은 값은 해당 값을 로컬에서 설정된 다른 값과 구분하는 제한되거나 간접적인 기능만으로 런타임 표현에서 마지막으로 사용된 값으로 고정될 수 있습니다. 이미지는 프로젝트에 있을 경우 원래 소스 참조가 아닌 이미지에 대한 개체 참조로 serialize되므로 원래 참조된 파일 이름 또는 URI가 모두 손실됩니다. 같은 페이지에서 선언된 리소스도 리소스 컬렉션의 키로 유지되지 않고 참조된 지점으로 serialize된 것으로 보입니다.

이벤트 처리가 유지되지 않음

XAML을 통해 이벤트 처리기가 serialize된 경우 이벤트 처리기는 유지되지 않습니다. 코드 숨김이 없고 관련 x:Code 메커니즘이 없는 XAML은 런타임 절차 논리를 serialize할 수 없습니다. serialization은 자체 포함되고 논리 트리로 제한되므로 이벤트 처리기를 저장하는 기능이 없습니다. 따라서 이벤트 처리기 특성(특성 자체 및 처리기를 명명하는 문자열 값)이 출력 XAML에서 제거됩니다.

XAMLWriter.Save 사용에 대한 실제 시나리오

여기 나열된 제한 사항은 꽤 중요하지만 serialization에 Save를 사용할 수 있는 여러 가지 적절한 시나리오가 있습니다.

  • 벡터 또는 그래픽 출력: 렌더링된 영역의 출력은 다시 로드될 때 같은 벡터나 그래픽을 재현하는 데 사용할 수 있습니다.

  • 서식 있는 텍스트 및 유동 문서: 텍스트 및 텍스트 내의 모든 요소 서식 및 요소 포함은 출력에서 유지됩니다. 이는 클립보드 기능과 비슷한 메커니즘에 유용할 수 있습니다.

  • 비즈니스 개체 데이터 유지: 데이터를 사용자 지정 요소(예: XML 데이터)에 저장한 경우 비즈니스 개체가 기본 XAML 규칙(예: 참조 방식 속성 값에 대한 사용자 지정 생성자 및 변환 제공)을 따른다면 이러한 비즈니스 개체는 serialization을 통해 지속될 수 있습니다.