2011-04-26 6 views
2

XML 문서의 이전 버전 읽기 :이 같은 직렬화 및 역 직렬화 요소와새로운 XML 요소를 추가하고 여전히 나는이처럼 보이는 XML 문서가 내 응용 프로그램의 버전 1에서

<settings> 
    <background>black</background> 
</settings> 

를 :

[XmlElement("background")] 
public string XMLbackground { 
    get { return backgroundcolor; } 
    set { backgroundcolor = value; } 
} 

하지만 지금은 버전 2에서 나는 배경 요소에 새 하위 요소를 추가 할 :

<settings> 
    <background> 
    <color>black</color> 
    <angle>62</angle> 
    </background> 
</settings> 

배경 요소가 더 이상 문자열이 아니라 클래스라는 의미입니다.

[XmlElement("background")] 
public BackgroundSettings background = new BackgroundSettings(); 

//... 

public class BackgroundSettings 
{ 

[XmlElement("color")] 
public string XMLcolor { 
    get { return backgroundcolor; } 
    set { backgroundcolor = value; } 
} 

[XmlElement("angle")] 
public string XMLangle { 
    get { return backgroundangle; } 
    set { backgroundangle = value; } 
    } 
} 

어떻게 지금 만들고 표준 .NET 직렬화 마크 업을 사용하여 버전 2 형식을 읽고 같은 코드를 사용하여 버전 1 XML 문서를 읽고 계속합니까?

+0

도움이 BackgroundSettings에 문자열에서 암시 적 변환을 구현합니까? –

+0

대답이 충분합니까 아니면 더 많은 답변을 기다리는 중입니까? 답변에 댓글을 달거나 동의 할 수 있습니다. –

답변

1

문서의 루트에 "version = x"를 추가하고 비 직렬화하기 전에 이것을 확인하는 것이 좋습니다. 그런 다음 코드에 두 가지 버전의 데이터 개체 (ConfigV1 및 ConfigV2)를 유지해야합니다. "version = x"값을 기준으로 XML을 deserialize하여 ConfigV1 또는 ConfigV2 인스턴스로 만듭니다. 개체가 ConfigV1 인 경우 호출 할 ConfigV1에서 ConfigV2로 수동 변환을 구현합니다.

필드를 추가하는 경우에만 필요합니다. 비 직렬화는 XML에 누락 된 필드를 건너 뛰고 기본값을 그대로 두어야하므로 필요하지 않습니다.

또는 당신이를 ISerializable와 생성자 구현하여 사용자 정의 직렬화를 구현할 수 (나는 이것을 시도하지 않았다을, 당신은 스스로를 시도해야 할 것이다) :

Config(SerializationInfo info,StreamingContext context) { 
    this.angle = info.GetString("angle"); 
    ... 
} 
관련 문제