2012-11-14 1 views
4

XmlSerializer을 사용하는 레거시 애플리케이션을 수정하여 XML 파일을 클래스로 직렬화/비 직렬화합니다. 요구 사항은 새 앱 버전의 특정 속성을 변경하여 이전 파일을 이전과 마찬가지로로드 할 수 있지만 다음 번에 업그레이드 된 (보다 일반적인) 속성을 유지해야합니다. 그 다음 오래된 속성은 다음 저장시에 버려 질 것입니다.XML 파일 용 시리얼 라이저 업그레이드

을 :

<Data> 
    <ImportantAnalysisResults> 
     <ImportantAnalysisResult>...</ImportantAnalysisResult> 
     <ImportantAnalysisResult>...</ImportantAnalysisResult> 
     <ImportantAnalysisResult>...</ImportantAnalysisResult> 
    </ImportantAnalysisResults> 
</Data> 

새로운 응용 프로그램 버전은 저장 파일을 제대로로드하고 다음에 새로운 하나를 사용하여 요소 이름을 교체해야합니다 : 조금 더 잘 설명 할

,이 파일이 모습입니다

<Data> 
    <Results> 
     <Result>...</Result> 
     <Result>...</Result> 
     <Result>...</Result> 
    </Results> 
</Data> 

<Data> 요소에는 더 많은 속성이 있지만이 속성을 변경해야합니다. 또한 ImportantAnalysisResultResult에서 상속됩니다. 내 Data 클래스에서

는,이 같은 일을 시도 :

class Data 
{ 
    [Obsolete("Used for backward compatibility. Use Results instead.")] 
    [XmlArrayItem("ImportantAnalysisResult", typeof(Result))] 
    public List<Result> ImportantAnalysisResults 
    { 
     get { return _results; } 
    } 

    public List<Result> Results 
    { 
     get { return _results; } 
    } 
} 

을하지만 여전히 새 파일에 예전의 속성을 저장합니다. 다음 저장시 ImportantAnalysisResults이 사라지는 가장 좋은 방법은 무엇입니까?

로딩하는 동안 이전 속성을 새 Results 속성에 "매핑"하는 방법이 있습니까?

답변

1

이렇게하는 한 가지 방법은 XmlAttributeOverrides입니다. XML 직렬화를 재정의하는 데 도움이됩니다. 희망이 도움이됩니다.

XmlAttributeOverrides xmlAttributeOverrides = new XmlAttributeOverrides(); 

//Add overrides to xmlAttributeOverrides, use sample from internet 

XmlSerializer serializer = new XmlSerializer(typeof(Data), XmlAttributeOverrides); 
+0

덕분에, 난 그냥이 http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlignoreattribute.aspx (['XmlIgnore']에 대한 MSDN 페이지에서 언급 한 것 보았다) 직렬화 또는 비 직렬화 중에 'XmlIgnore'를 재정의하는 방법으로. 직렬화 중에 만 무시할 수 있으면 작동 할 수도 있습니다. – Lou

+0

[XmlIgnore] 특성을 사용하여 객체 구성원을 직렬화 및 비 직렬화에서 무시합니다 (둘 다에서). 한 가지 방법으로 만 조정할 수는 없습니다. 행운을 빈다. – RajN

+0

'XmlAttributeOverrides'는'XmlSerializer' 인스턴스마다 한 번 인스턴스화됩니다. 따라서 직렬화하는 동안에만 지정하면 파일을 저장하는 동안 속성을 무시합니다. – Lou