2009-07-30 6 views
0

첫 번째 시나리오에서는 모든 것이 매우 쉽습니다. 강력한 XML 형식으로 deserialize 할 수있는 다음 XML이 있습니다.동적 XML 역 직렬화

<providers> 
    <dprovider> 
     <dimensions> 
     <width></width> 
    </dimensions> 
    </dbrovider> 
2 시나리오에서

, 나는 도움이 필요하십니까 곳입니다 ... 난 당신이 크기를 볼 수있는

<providers> 
    <dprovider> 
     <dimensions> 
     <width></width> 
    </dimensions> 
    </dbrovider> 
    <dprovider> 
     <dimensions> 
     <height></height> 
    </dimensions> 
    </dbrovider> 

좀 더 역동적 인 뭔가를 하위 구조는 두 항목 모두 다르므로 강력하게 형식화 된 클래스를 만드는 방법을 찾아 차원 요소에 대한 변경 사항을 처리 할 수 ​​있어야합니다. 예를 들어 wh ole 중첩 된 하위 구조. 각 dbprovider에 대해 다릅니다.

어떻게 수행되는지에 대한 아이디어가 있습니까?

답변

2

이 시도 :

[Serializable] 
class Dimension { ... } 

[Serializable] 
class Height : Dimension { ... } 

[Serializable] 
class Width : Dimension { ... } 

를 그런 다음 (복수주의) 요소로 역 직렬화 클래스에있는이 속성 : 여기

[XmlElement(Type = typeof(Height), ElementName = "height")] 
[XmlElement(Type = typeof(Width), ElementName = "width")] 
public Dimension[] DimensionArray { 
    get { ... } 
    set { ... } 
} 

documentation on XML serialization (XMLELEMENT의 시작 지점이 있어요 클래스)를 사용하여 나머지 세부 정보를 파악할 수 있습니다.

올바른 속성과 클래스를 System.Xml.Serialization 네임 스페이스의 올바른 특성으로 간단하게 꾸미면 공급자 개체를 serialize/deserialize 할 수 있어야합니다.

0

마음에 떠오르는 첫 번째 일은 맞춤식 비 직렬화입니다. 이 때 dprovider 클래스에는 Dimensions라는 객체 > List가있을 수 있습니다. Dimensions에는 필요한 하위 객체 호스트가 있습니다. 당신이 "is"논리의 무리를해야하기 때문에 유일한 고통은 그들을 되 찾는 것입니다.

"전체 중첩 된 하위 구조"를 찾으려면 해당 하위 구조를 자체 클래스/구조체로 정의한 다음 차원 목록에 추가해야합니다.

+0

개체 목록이있는 경우 -> 해당 컬렉션의 모든 구조체로 개체를 저장할 수있을 것 같습니까? –

+0

정확하게,하지만 난 코드를 같이하기 때문에이, 당신의 요구 사항을 "강력하게 입력 할 필요가있다"충전되어 있는지 확실하지 않습니다 : (dProvider.Dimensions [0] ObjWithHeight이다) 경우 높이 = ((ObjWithHeight) dProvider.Dimensions [0]). 높이; 매번 캐스팅을해야한다는 것은 왕가의 고통입니다. 선택한 방법이 아닌 최종 목표가 무엇인지에 대해보다 명확하게 설명하려면 커스텀 역 직렬화 + 객체 목록 + 캐스팅보다 커뮤니티가 제안 할 수있는 다른 방법이있을 수 있습니다. – JustLoren

1

XML 직렬화/직렬화 해제에 C#의 요점을 놓칠 수도 있습니다.

스키마를 정의하거나 이미 가지고있는 스키마를 사용하고 스키마를 지원하는 C# 클래스를 만들어야합니다. See MSDN article on xsd.exe

다른 경로는 C# 클래스를 만들고 마크 업에서 컬렉션에 래핑 한 다음 XML 특성을 추가하는 것입니다. 이것은 기본적으로 XML 스키마를 정의합니다. See here for starting point on the XmlRootAttribute

+0

정상적인 XML 직렬 변환기보다 나은 컬렉션을 처리 할 수있는 DataContractSerializer를 사용할 수 있습니다. 네가 필요하다면 나는 말할 수 없다. –