2016-10-24 2 views
0

두 개의 다른 유형이있는 요소가 포함 된 XML 파일을 deserialize해야합니다.다른 xsi : style을 사용하여 요소를 비 직렬화

<XmlInclude(GetType(loopTerminatedType))> _ 
Public Class PosResponseLoop 

첫번째는 유사한 정의 될 수있다 :

<XmlElement("loop")> Public prLoop() As PosResponseLoop 

두번째는 다음과 같이 정의된다 :
예 :로

내 소스에서
<loop xsi:type="loopDynamicLengthType"> 
... 
<loop xsi:type="loopTerminatedType"> 
... 

클래스가 정의되고 방식 및 동일한 이름,

<XmlInclude(GetType(loopDynamicLengthType))> _ 
Public Class PosResponseLoop 

하지만 컴파일러는 말한다 :

class 'PosResponseLoop' and class 'PosResponseLoop' conflict in namespace 'WindowsApplication1'. 

내가 그것을 어떻게 해결할 수 있습니까?

답변

1

표준 속성 xsi:type을 사용하면 XML 요소에서 명시 적으로 해당 유형을 표기 할 수 있습니다. 이 경우 요소 <loop>loopDynamicLengthTypeloopTerminatedType의 두 가지 유형을 가질 수 있습니다. 설명 된대로 here, XmlSerializerxsi:type 정보를 사용하여 XML 요소를 특정 .Net 유형으로 매핑합니다.

<XmlInclude(GetType(LoopTerminatedType))> _ 
<XmlInclude(GetType(LoopDynamicLengthType))> _ 
Public MustInherit Class PosResponseLoop 
End Class 

<XmlType("loopTerminatedType")> _ 
Public Class LoopTerminatedType 
    Inherits PosResponseLoop 
End Class 

<XmlType("loopDynamicLengthType")> _ 
Public Class LoopDynamicLengthType 
    Inherits PosResponseLoop 
End Class 

<XmlInclude> 속성 : 그래서 당신이해야 할 일 (아마도 반드시 추상적 아니지만) 하나의 기본 클래스가 각각 두 가지 xsi:type 값에 해당하는 두 개의 서브 클래스로, 루프의 가능한 모든 유형을 표시하는 것입니다 기본 클래스에서 발생할 수있는 가능한 부속 유형 세트를 지정하십시오. 파생 클래스의 <XmlType(String)> 특성은 해당 xsi:type 특성 값으로 표시 될 이름을 지정합니다.

Public Class RootObject 
    <XmlElement("loop")> Public prLoop() As PosResponseLoop 
End Class 

샘플 fiddle :

그런 다음 포함 유형과 같아야합니다.

관련 문제