첨부 된 속성을 직렬화하는 방법
-
06-07-2019 - |
문제
복합 응용 프로그램 라이브러리를 사용하여 .NET3.5, WPF 응용 프로그램을 작성하고 있습니다. 응용 프로그램은 여러 모듈로 나뉩니다.
인프라 모듈에서 NetworkNode 객체를 정의했습니다. 네트워크 모듈은 NetworkNodes 모음을 관리하고 XmlSerializer를 사용 하여이 컬렉션을 저장/로드합니다. 지금까지 모든 것이 작동합니다.
그러나 나는 다른 모듈, 즉 nodemodule이 있습니다. 네트워크 모듈에서 네트워크 노드를 선택한 경우 eventAggregator를 사용하여 이벤트가 다른 모듈에 게시됩니다. 이 모듈은 첨부 된 속성을 사용하여 다양한 정보를 네트워크 노드에 첨부 할 수 있습니다.
문제는 NetworkModule이 다른 모듈에 대해 알지 못하므로 이러한 특성이 직렬화되지 않습니다. 객체에 첨부 된 모든 속성을 어떻게 든 목록하고 직렬화 할 수 있습니까? 아니면 개념을 변경하고 첨부 된 속성보다 다른 것을 사용해야합니까?
문안 인사
해결책
사용 사용 객체에 정의 된 모든 종속성 속성 (첨부 여부)을 나열 할 수 있습니다. DependencyObject.GetLocalValueEnumerator
:
LocalValueEnumerator propEnumerator = foo.GetLocalValueEnumerator();
while (propEnumerator.MoveNext())
{
Console.WriteLine ("{0} = {1}",
propEnumerator.Current.Property.Name,
propEnumerator.Current.Value);
}
그러나 이는 XML 직렬화에 도움이되지 않습니다 (IXMLSerializable을 구현하지 않는 한 고통입니다 ...). 아마 사용해야합니다 XamlWriter
대신 (내가 드류가 말한 것 같아요. XamlSerializer
...)
다른 팁
첨부 된 특성은 순수한 CLR 관점에서 볼 수 없기 때문에 XMLSerializer는 이에 대해 알 수있는 방법이 없습니다. "일반"CLR 객체를 직렬화하고 종속성 관에 대한 특별한 지식을 갖기 위해 XamlSerializer 아키텍처를 사용하려면 전환해야합니다.
.NET 4.0을 사용하는 경우 (.NET 3.5에 있지 않다고 생각합니다)
당신은 둘 중 하나를 사용할 수 있습니다 IATTACHEDPROPERTYSTORE 또는 첨부 가능한 프로파인 서비스
또한 일반적으로 첨부 된 속성은 올바르게 정의되어야합니다.
- 공개 (또는 일부 시나리오에서 내부 공사)의 재산이 아닌 유형의 속성이어야합니다 (예 : 다른 유형 내부에서 선언되지 않음), T.
- 새로운 AttachableMemberIdentifier (T, "MyProperty") 정의
- "setmyproperty"및 "getmyproperty"라는 t에 공개 정적 메소드를 제공합니다. 즉, "myProperty"부분은 첨부 블레임에 딜리티체와 일치해야합니다. (XAML 세리어 라이저 스택은 반사를 통해 찾아야하기 때문에 첨부 블리 덴티프의 이름으로 "foo"를 사용할 수없고 "setbar"및 "getbar"라고 부를 수 없습니다. 그러면 이러한 방법은 첨부 가능한 속성 값을 저장하기 위해 첨부 가능한 프로페티 서비스를 활용해야합니다. .
참조 예제 #2 : http://blogs.msdn.com/b/mwinkle/archive/2009/12/07/attachedproperty-part-putting-it-togeth.aspx