2017-03-11 17 views
0

WebInvoke POST 호출에서 XML을 사용하려고합니다. 다음과 같이 XML 구조와 XML을 반영하는 주요 클래스는 자체입니다CollectionDataContract가 DataContract를 인식하지 못합니다.

XML :

<GraphicArea> 
    <AnimationID>String content</AnimationID> 
    <AutoRetract>true</AutoRetract> 
    <ClientID>2147483647</ClientID> 
    <Description>String content</Description> 
    <GraphicDetails> 
    <GraphicDetail xmlns="http://schemas.datacontract.org/2004/07/fogREST"> 
     <GraphicID>String content</GraphicID> 
     <PropFileDescription>String content</PropFileDescription> 
     <PropFileID>String content</PropFileID> 
     <PropName>String content</PropName> 
     <PropValue>String content</PropValue> 
    </GraphicDetail> 
    <GraphicDetail xmlns="http://schemas.datacontract.org/2004/07/fogREST"> 
     <GraphicID>String content</GraphicID> 
     <PropFileDescription>String content</PropFileDescription> 
     <PropFileID>String content</PropFileID> 
     <PropName>String content</PropName> 
     <PropValue>String content</PropValue> 
    </GraphicDetail> 
    </GraphicDetails> 
    <GraphicSubTypeID>String content</GraphicSubTypeID> 
    <GraphicTypeID>String content</GraphicTypeID> 
    <GraphicTypeTemplateID>String content</GraphicTypeTemplateID> 
    <OffsetX>2147483647</OffsetX> 
    <OffsetY>2147483647</OffsetY> 
    <OffsetZ>2147483647</OffsetZ> 
    <TimeCodeIn>String content</TimeCodeIn> 
    <TimeCodeOut>String content</TimeCodeOut> 
    <UserID>2147483647</UserID> 
</GraphicArea> 

DataContract :

[DataContract(Name = "GraphicArea", Namespace = "")] 
public class GraphicArea 
{ 
    [DataMember(Name = "ClientID")] 
    public virtual int ClientID 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "AnimationID")] 
    public virtual string AnimationID 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "GraphicTypeID")] 
    public virtual string GraphicTypeID 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "GraphicSubTypeID")] 
    public virtual string GraphicSubTypeID 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "GraphicTypeTemplateID")] 
    public virtual string GraphicTypeTemplateID 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "TimeCodeIn")] 
    public virtual string TimeCodeIn 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "TimeCodeOut")] 
    public virtual string TimeCodeOut 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "AutoRetract")] 
    public virtual bool AutoRetract 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "Description")] 
    public virtual string Description 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "UserID")] 
    public virtual int UserID 
    { 
     get; 
     set; 
    } 

    [DataMember(Name = "GraphicDetails")] 
    public GraphicDetailsCollection GraphicDetails 
    { 
     get; 
     set; 
    } 

    [DataMember(Name = "OffsetX")] 
    public virtual int OffsetX 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "OffsetY")] 
    public virtual int OffsetY 
    { 
     get; 
     set; 
    } 
    [DataMember(Name = "OffsetZ")] 
    public virtual int OffsetZ 
    { 
     get; 
     set; 
    } 
} 

것은 당신이 내가 CollectionDataContract이 GraphicDetailsCollection라는이 볼 수 있듯이 다음과 같이 구조화되어 있습니다.

[CollectionDataContract] 
public class GraphicDetailsCollection : List<GraphicDetail> 
{ 

} 

컬렉션 자체는 다음과 같습니다. 매우 간단하고 DataContract를 의미 : 잠재적으로 GraphicDetails 내 GraphicDetail 섹션의 수가있을 수 있기 때문에

[DataContract] 
public class GraphicDetail 
{ 
    [DataMember(IsRequired = false)] 
    public string GraphicID; 

    [DataMember(IsRequired = false)] 
    public string PropName; 

    [DataMember(IsRequired = false)] 
    public string PropValue; 

    [DataMember(IsRequired = false)] 
    public string PropFileID; 

    [DataMember(IsRequired = false)] 
    public string PropFileDescription; 
} 

내가이 설정을 가지고있다. GraphicDetails의 GraphicDetail 컨텐트를 제외하고 XML 파인 내의 모든 데이터를 처리 할 수 ​​있습니다. 내가 가진 문제는 contract.GraphicDetails.Count에 대한 참조를 만들어 GraphicDetail의 다양한 세트를 반복 할 때 contract.GraphicDetails.Count = 0 및 그 모두가 DataMembers = Null 인 것을 확인하는 것입니다.

누군가가 왜 이런지 설명 할 수 있습니까? 나는 DataContracts에 다소 익숙하며 컬렉션이나 계약을 완전히 이해하지 않고 매우 가까이 있거나 자신을 모퉁이로 생각하고 다른 접근 방식이 필요하다고 느낍니다.

의견을 보내 주시면 감사하겠습니다.

답변

0

표시된 XML에서 <GraphicDetail>default namespacexmlns="http://schemas.datacontract.org/2004/07/fogREST"입니다. 따라서 요소와 모든 자식 요소는 명시 적 네임 스페이스 접두사가없는 한 해당 네임 스페이스에 있습니다. 데이터 계약에 그 사실을 반영해야합니다.

[CollectionDataContract(Namespace = "http://schemas.datacontract.org/2004/07/fogREST")] // All GraphicDetail child XML elements are to be in the indicated namespace 
public class GraphicDetailsCollection : List<GraphicDetail> 
{ 
} 

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/fogREST")] // All data member child XML elements are to be in the indicated namespace 
public class GraphicDetail 
{ 
    [DataMember(IsRequired = false)] 
    public string GraphicID; 

    [DataMember(IsRequired = false)] 
    public string PropName; 

    [DataMember(IsRequired = false)] 
    public string PropValue; 

    [DataMember(IsRequired = false)] 
    public string PropFileID; 

    [DataMember(IsRequired = false)] 
    public string PropFileDescription; 
} 
+0

안녕하세요 dbc, 우선 감사합니다. 이 작업을 수행 할 수 있었지만 지금 null 값이 있거나 없을 수도있는 단일 DataMember가있는 문제가 발생했습니다. 현재 설정에서 PropContile에 대한 값이 없으면 DataContractSerializer는 필드를 반환하지만 실제로이 요소를 무시 (생성되지 않음)하도록하는 것이 좋습니다. 이것을 달성 할 수있는 방법이 있습니까? EmitDefaultValue = false는 올바른 트랙에 표시되지만 직렬화 및 비 직렬화에서만 작동합니다. –

+0

@ChrisHarvey - ['DataMemberAttribute.EmitDefaultValue'] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.emitdefaultvalue (v = vs.110) .aspx)가 작동해야합니다. 그러나 당신은 옳은 길에있는 것처럼 보이지만 직렬화와 비 직렬화에 대해서만 작동합니다. *이 경우 나는 작동하지 않는 것을 보여주는 완전한 [mcve]로 두 번째 질문을하는 것이 좋습니다. – dbc

+0

안녕하세요 dbc, 나는이 문제에 대해 더 자세히 설명하기 위해 새로운 질문을 만들었습니다. 확인해 주시겠습니까? http://stackoverflow.com/questions/42800889/datacontractserializer-not-allowing-dynamic-datamembers –