2014-07-02 41 views
1

我正嘗試反序列化下面的XML:C#的反序列化null元素

@"<Activity type=""WOActivity""> 
<ActionID>1</ActionID> 
<ActionLog></ActionLog> 
<ActionLogSummary>Add subcomponent</ActionLogSummary> 
<UserID></UserID> 
<FlexFields> 
    <FlexField mappedTo=""STATUS"" id=""0"">WAPPR</FlexField> 
    <FlexField mappedTo=""WOSEQUENCE"" id=""0"">10</FlexField> 
    <FlexField mappedTo=""OWNERGROUP"" id=""0"">V-PSB-DE-HLC-HWSUPPORT</FlexField> 
</FlexFields> 

從來就也下面的類,這是由所產生的xsd:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://b2b.ibm.com/schema/IS_B2B_CDM/R2_2")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://b2b.ibm.com/schema/IS_B2B_CDM/R2_2", IsNullable = false)] 
public partial class Activity { 

    private string actionIDField; 

    private string actionLogField; 

    private string actionLogSummaryField; 

    private System.DateTime logDateTimeField; 

    private bool logDateTimeFieldSpecified; 

    private System.DateTime scheduledStartDateTimeField; 

    private bool scheduledStartDateTimeFieldSpecified; 

    private System.DateTime scheduledEndDateTimeField; 

    private bool scheduledEndDateTimeFieldSpecified; 

    private System.DateTime workBeginDateTimeField; 

    private bool workBeginDateTimeFieldSpecified; 

    private System.DateTime workEndDateTimeField; 

    private bool workEndDateTimeFieldSpecified; 

    private string userIDField; 

    private string userNameField; 

    private FlexFieldsFlexField[] flexFieldsField; 

    private string activityTypeField; 

    private string typeField; 

    private string indexField; 

    /// <remarks/> 

    public string ActionID { 
     get { 
      return this.actionIDField; 
     } 
     set { 
      this.actionIDField = value; 
     } 
    } 

    /// <remarks/> 
    public string ActionLog { 
     get { 
      return this.actionLogField; 
     } 
     set { 
      this.actionLogField = value; 
     } 
    } 
    /// <remarks/> 
    /// 
    [System.Xml.Serialization.XmlElement] 
    public string ActionLogSummary { 
     get { 
      return this.actionLogSummaryField; 
     } 
     set { 
      this.actionLogSummaryField = value; 
     } 
    } 

    /// <remarks/> 
    public System.DateTime LogDateTime { 
     get { 
      return this.logDateTimeField; 
     } 
     set { 
      this.logDateTimeField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool LogDateTimeSpecified { 
     get { 
      return this.logDateTimeFieldSpecified; 
     } 
     set { 
      this.logDateTimeFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    public System.DateTime ScheduledStartDateTime { 
     get { 
      return this.scheduledStartDateTimeField; 
     } 
     set { 
      this.scheduledStartDateTimeField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool ScheduledStartDateTimeSpecified { 
     get { 
      return this.scheduledStartDateTimeFieldSpecified; 
     } 
     set { 
      this.scheduledStartDateTimeFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    public System.DateTime ScheduledEndDateTime { 
     get { 
      return this.scheduledEndDateTimeField; 
     } 
     set { 
      this.scheduledEndDateTimeField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool ScheduledEndDateTimeSpecified { 
     get { 
      return this.scheduledEndDateTimeFieldSpecified; 
     } 
     set { 
      this.scheduledEndDateTimeFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    public System.DateTime WorkBeginDateTime { 
     get { 
      return this.workBeginDateTimeField; 
     } 
     set { 
      this.workBeginDateTimeField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool WorkBeginDateTimeSpecified { 
     get { 
      return this.workBeginDateTimeFieldSpecified; 
     } 
     set { 
      this.workBeginDateTimeFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    public System.DateTime WorkEndDateTime { 
     get { 
      return this.workEndDateTimeField; 
     } 
     set { 
      this.workEndDateTimeField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool WorkEndDateTimeSpecified { 
     get { 
      return this.workEndDateTimeFieldSpecified; 
     } 
     set { 
      this.workEndDateTimeFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    public string UserID { 
     get { 
      return this.userIDField; 
     } 
     set { 
      this.userIDField = value; 
     } 
    } 

    /// <remarks/> 
    public string UserName { 
     get { 
      return this.userNameField; 
     } 
     set { 
      this.userNameField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlArrayItemAttribute("FlexField", IsNullable = false)] 
    public FlexFieldsFlexField[] FlexFields { 
     get { 
      return this.flexFieldsField; 
     } 
     set { 
      this.flexFieldsField = value; 
     } 
    } 

    /// <remarks/> 
    public string ActivityType { 
     get { 
      return this.activityTypeField; 
     } 
     set { 
      this.activityTypeField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string type { 
     get { 
      return this.typeField; 
     } 
     set { 
      this.typeField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute(DataType = "integer")] 
    public string index { 
     get { 
      return this.indexField; 
     } 
     set { 
      this.indexField = value; 
     } 
    } 
} 

我做了一個單元測試,但因爲所有的元素都是null(第二個斷言),所以失敗了。 type屬性反序列化就好了。

什麼可能是錯誤的?

PS:從來就試圖命名空間「http://b2b.ibm.com/schema/B2B_CDM_Incident/R2_2」添加到串行器,但沒有成功...

PS2:序列化似乎是工作就好了該類

感謝。

   string result = @"<Activity type=""WOActivity""> 
    <ActionID>1</ActionID> 
    <ActionLog></ActionLog> 
    <ActionLogSummary>Add subcomponent</ActionLogSummary> 
    <UserID></UserID> 
    <FlexFields> 
     <FlexField mappedTo=""STATUS"" id=""0"">WAPPR</FlexField> 
     <FlexField mappedTo=""WOSEQUENCE"" id=""0"">10</FlexField> 
     <FlexField mappedTo=""OWNERGROUP"" id=""0"">V-PSB-DE-HLC-HWSUPPORT</FlexField> 
    </FlexFields> 
</Activity>"; 
    var serializer = new XmlSerializer(typeof (Activity), new XmlRootAttribute("Activity")); 
      var first = (Activity)serializer.Deserialize(new XmlTextReader(new StringReader(result))); 
      Assert.AreEqual("WOActivity", first.type); 
      Assert.AreEqual("Add subcomponent", first.ActionLogSummary); 
      Assert.IsNotNull(first.FlexFields); 
      Assert.AreEqual(4, first.FlexFields.Count()); 
+0

Definetely它是與命名空間... 刪除的命名空間中的聲明,類定義的伎倆,但我還是想知道,然後,聲明XL或串行器的正確方法是什麼,以便它能與那個確切的類定義一起工作。 謝謝 –

+0

這甚至不應該反序列化(它應該拋出一個錯誤);命名空間'http:// b2b.ibm.com/schema/IS_B2B_CDM/R2_2'沒有在根元素 –

回答

1

只要把根元素到正確的命名空間:

string xml = @"<Activity type=""WOActivity"" 
     xmlns=""http://b2b.ibm.com/schema/IS_B2B_CDM/R2_2""> 
    ... 
    </Activity>"; 

注意,因爲命名空間是繼承,其他的一切也使用該元素。

這則作品:

var ser = new XmlSerializer(typeof(Activity)); 
var activity = (Activity)ser.Deserialize(new StringReader(xml)); 
System.Console.WriteLine(activity.ActionID); 
System.Console.WriteLine(activity.ActionLogSummary); 
System.Console.WriteLine(activity.type); 

與輸出:

1 
Add subcomponent 
WOActivity 

在其他情況下,你可能需要參考多個命名空間,或提相同的命名空間多次。然後聲明一個別名會很有用;以下是語義上的第一個例子中這樣的回答:

string xml = @"<b2b:Activity type=""WOActivity"" 
     xmlns:b2b=""http://b2b.ibm.com/schema/IS_B2B_CDM/R2_2""> 
<b2b:ActionID>1</b2b:ActionID> 
<b2b:ActionLog></b2b:ActionLog> 
<b2b:ActionLogSummary>Add subcomponent</b2b:ActionLogSummary> 
       ... 
       </b2b:Activity>"; 

有了,我們現在可以在任何元素上使用b2b:作爲前綴作爲替代說法xmlns=""http://b2b.ibm.com/schema/IS_B2B_CDM/R2_2""唯一的區別。還要注意,別名基於名稱空間是不是繼承,不像xmlns=名稱空間。

1

只是刪除生成的兩個行:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://b2b.ibm.com/schema/IS_B2B_CDM/R2_2")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://b2b.ibm.com/schema/IS_B2B_CDM/R2_2", IsNullable = false)] 
+0

上聲明,這就是我所做的,它工作正常。只是想知道我在xml中丟失了什麼。 012ks Tks –