2017-03-11 5 views
0

WebInvoke POST呼び出しからXMLを使用しようとしています。DataContractを認識できないCollectionDataContract

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; 
    } 
} 

をあなたは私があることGraphicDetailsCollectionをCollectionDataContractと呼ばれている見ることができるように、次のようにXML構造やXML自体を反映した主なクラスがあります

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

} 

コレクション自体は次のとおりです。非常に簡単とのDataContractを参照:

[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セクションの数に制限はありませんので、私は、このセットアップを持っています。 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を持つ問題が発生しています。私の現在の設定で 、DataContractSerializerはPropFileIDの値がない場合は、フィールドを返すが、私が本当にしたいことは、完全にこの要素を無視(生成されていない)を持つことがあるでしょう。これを達成する方法はありますか? EmitDefaultValue = falseは正しいトラックにあるように見えますが、直列化でのみ動作し、逆シリアル化では機能しません。 –

+0

@ChrisHarvey - ['DataMemberAttribute.EmitDefaultValue'](https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.emitdefaultvalue(v = vs.110).aspx)が動作するはずです。しかし、あなたは書いていますが、正しいトラックにあるように見えますが、シリアライゼーションではなくデシリアライゼーションでしか動作しません。*その場合は、2番目の質問に完全な[mcve] – dbc

+0

こんにちはdbc、私は問題をさらに詳しく説明するために新しい質問を作成しました。それをチェックしてもよろしいですか? http://stackoverflow.com/questions/42800889/datacontractserializer-not-allowing-dynamic-datamembers –

関連する問題