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에 다소 익숙하며 컬렉션이나 계약을 완전히 이해하지 않고 매우 가까이 있거나 자신을 모퉁이로 생각하고 다른 접근 방식이 필요하다고 느낍니다.
의견을 보내 주시면 감사하겠습니다.
안녕하세요 dbc, 우선 감사합니다. 이 작업을 수행 할 수 있었지만 지금 null 값이 있거나 없을 수도있는 단일 DataMember가있는 문제가 발생했습니다. 현재 설정에서 PropContile에 대한 값이 없으면 DataContractSerializer는 필드를 반환하지만 실제로이 요소를 무시 (생성되지 않음)하도록하는 것이 좋습니다. 이것을 달성 할 수있는 방법이 있습니까? EmitDefaultValue = false는 올바른 트랙에 표시되지만 직렬화 및 비 직렬화에서만 작동합니다. –
@ChrisHarvey - ['DataMemberAttribute.EmitDefaultValue'] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.emitdefaultvalue (v = vs.110) .aspx)가 작동해야합니다. 그러나 당신은 옳은 길에있는 것처럼 보이지만 직렬화와 비 직렬화에 대해서만 작동합니다. *이 경우 나는 작동하지 않는 것을 보여주는 완전한 [mcve]로 두 번째 질문을하는 것이 좋습니다. – dbc
안녕하세요 dbc, 나는이 문제에 대해 더 자세히 설명하기 위해 새로운 질문을 만들었습니다. 확인해 주시겠습니까? http://stackoverflow.com/questions/42800889/datacontractserializer-not-allowing-dynamic-datamembers –