2011-07-20 28 views
2

我在.Net應用程序中使用第三方Web服務[WS]。 我的應用程序使用從WS的wsdl生成的實體類。 我從數據庫中獲取數據,將其填充到實體對象中,然後使用XmlSerializer類生成一個xml。以編程方式控制XML元素的順序

WS的一個方法需要這個xml字符串作爲input.And xml應該有與WS.預期相同的順序的元素。但是發生什麼是一些元素在我的應用程序中顛倒了所以WS正在拋出一個關於序列化的內部異常: _innerException {「序列不一致:如果用在其中一個類的成員上,所有粒子類成員都需要'Order'屬性,請使用類成員'工具上的XmlElement,XmlAnyElement或XmlArray自定義屬性明確設置'Order' 。」「} {System.Exception的} System.InvalidOperationException

XmlSerializer serializer = new XmlSerializer(typeof(totemmessage)); 

所以,我的問題在這裏,我怎麼編程方式將其發送到WS注意之前的控制我的應用程序,這些XML元素的順序?我不想爲此使用xslt。

感謝您的閱讀。

這裏是我的實體類:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(TypeName="totem-message")] 
    [System.Xml.Serialization.XmlRootAttribute("totem", Namespace="", IsNullable=false)] 
    public partial class totemmessage { 

     private object itemField; 

     private ItemChoiceType1 itemElementNameField; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute("error", typeof(errorinfo))] 
     [System.Xml.Serialization.XmlElementAttribute("parseReport", typeof(parseReportinfo))] 
     [System.Xml.Serialization.XmlElementAttribute("results", typeof(templateinfo))] 
     [System.Xml.Serialization.XmlElementAttribute("subareas", typeof(subareasinfo))] 
     [System.Xml.Serialization.XmlElementAttribute("template", typeof(templateinfo))] 
     [System.Xml.Serialization.XmlElementAttribute("upload", typeof(templateinfo))] 
     [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")] 
     [System.Xml.Serialization.XmlElement(Order = 0)]  
     public object Item { 
      get { 
       return this.itemField; 
      } 
      set { 
       this.itemField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 1)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()] 
     public ItemChoiceType1 ItemElementName { 
      get { 
       return this.itemElementNameField; 
      } 
      set { 
       this.itemElementNameField = value; 
      } 
     }   

    } 

[System.Xml.Serialization.XmlIncludeAttribute(typeof(energyInstrument))] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    public abstract partial class abstractEnergyInstrument { 

     private energyContractTime periodField; 

     private bool periodFieldSpecified; 

     private System.DateTime startDateField; 

     private bool startDateFieldSpecified; 

     private System.DateTime endDateField; 

     private bool endDateFieldSpecified; 

     private System.DateTime expiryDateField; 

     private bool expiryDateFieldSpecified; 

     private energyInstrumentClassifier typeField; 

     private bool typeFieldSpecified; 

     private string strikeField; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 0)] 
     public energyContractTime period { 
      get { 
       return this.periodField; 
      } 
      set { 
       this.periodField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 1)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool periodSpecified { 
      get { 
       return this.periodFieldSpecified; 
      } 
      set { 
       this.periodFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(DataType="date", Order =2)]   
     public System.DateTime startDate { 
      get { 
       return this.startDateField; 
      } 
      set { 
       this.startDateField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 3)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool startDateSpecified { 
      get { 
       return this.startDateFieldSpecified; 
      } 
      set { 
       this.startDateFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(DataType="date", Order =4)]   
     public System.DateTime endDate { 
      get { 
       return this.endDateField; 
      } 
      set { 
       this.endDateField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 5)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool endDateSpecified { 
      get { 
       return this.endDateFieldSpecified; 
      } 
      set { 
       this.endDateFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(DataType="date", Order =6)]   
     public System.DateTime expiryDate { 
      get { 
       return this.expiryDateField; 
      } 
      set { 
       this.expiryDateField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 7)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool expiryDateSpecified { 
      get { 
       return this.expiryDateFieldSpecified; 
      } 
      set { 
       this.expiryDateFieldSpecified = value; 
      } 
     } 

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

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 9)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool typeSpecified { 
      get { 
       return this.typeFieldSpecified; 
      } 
      set { 
       this.typeFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 10)] 
     public string strike { 
      get { 
       return this.strikeField; 
      } 
      set { 
       this.strikeField = value; 
      } 
     } 
    } 

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlRootAttribute("instrument", Namespace="", IsNullable=false)] 
    public partial class energyInstrument : abstractEnergyInstrument { 

     private decimal priceField; 

     private bool priceFieldSpecified; 

     private decimal forwardField; 

     private bool forwardFieldSpecified; 

     private decimal volField; 

     private bool volFieldSpecified; 

     private decimal consensusPriceField; 

     private bool consensusPriceFieldSpecified; 

     private decimal compositePriceField; 

     private bool compositePriceFieldSpecified; 

     private decimal reconstitutedForwardField; 

     private bool reconstitutedForwardFieldSpecified; 

     private decimal consensusVolField; 

     private bool consensusVolFieldSpecified; 

     private decimal compositeVolField; 

     private bool compositeVolFieldSpecified; 

     private string priceOutField; 

     private decimal priceRangeField; 

     private bool priceRangeFieldSpecified; 

     private decimal priceStddevField; 

     private bool priceStddevFieldSpecified; 

     private string volOutField; 

     private decimal volRangeField; 

     private bool volRangeFieldSpecified; 

     private decimal volStddevField; 

     private bool volStddevFieldSpecified; 

     private string contributorsField; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 0)] 
     public decimal price { 
      get { 
       return this.priceField; 
      } 
      set { 
       this.priceField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 1)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool priceSpecified { 
      get { 
       return this.priceFieldSpecified; 
      } 
      set { 
       this.priceFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 2)] 
     public decimal forward { 
      get { 
       return this.forwardField; 
      } 
      set { 
       this.forwardField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 3)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool forwardSpecified { 
      get { 
       return this.forwardFieldSpecified; 
      } 
      set { 
       this.forwardFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 4)] 
     public decimal vol { 
      get { 
       return this.volField; 
      } 
      set { 
       this.volField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 5)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool volSpecified { 
      get { 
       return this.volFieldSpecified; 
      } 
      set { 
       this.volFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 6)] 
     public decimal consensusPrice { 
      get { 
       return this.consensusPriceField; 
      } 
      set { 
       this.consensusPriceField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 7)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool consensusPriceSpecified { 
      get { 
       return this.consensusPriceFieldSpecified; 
      } 
      set { 
       this.consensusPriceFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 8)] 
     public decimal compositePrice { 
      get { 
       return this.compositePriceField; 
      } 
      set { 
       this.compositePriceField = value; 
      } 
     } 

     /// <remarks/>   
     [System.Xml.Serialization.XmlElement(Order = 9)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool compositePriceSpecified { 
      get { 
       return this.compositePriceFieldSpecified; 
      } 
      set { 
       this.compositePriceFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 10)] 
     public decimal reconstitutedForward { 
      get { 
       return this.reconstitutedForwardField; 
      } 
      set { 
       this.reconstitutedForwardField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 11)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool reconstitutedForwardSpecified { 
      get { 
       return this.reconstitutedForwardFieldSpecified; 
      } 
      set { 
       this.reconstitutedForwardFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 12)] 
     public decimal consensusVol { 
      get { 
       return this.consensusVolField; 
      } 
      set { 
       this.consensusVolField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 13)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool consensusVolSpecified { 
      get { 
       return this.consensusVolFieldSpecified; 
      } 
      set { 
       this.consensusVolFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 14)] 
     public decimal compositeVol { 
      get { 
       return this.compositeVolField; 
      } 
      set { 
       this.compositeVolField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 15)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool compositeVolSpecified { 
      get { 
       return this.compositeVolFieldSpecified; 
      } 
      set { 
       this.compositeVolFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 16)] 
     public string priceOut { 
      get { 
       return this.priceOutField; 
      } 
      set { 
       this.priceOutField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 17)] 
     public decimal priceRange { 
      get { 
       return this.priceRangeField; 
      } 
      set { 
       this.priceRangeField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 18)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool priceRangeSpecified { 
      get { 
       return this.priceRangeFieldSpecified; 
      } 
      set { 
       this.priceRangeFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 

     [System.Xml.Serialization.XmlElement(Order = 19)] 
     public decimal priceStddev 
     { 
      get { 
       return this.priceStddevField; 
      } 
      set { 
       this.priceStddevField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 20)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool priceStddevSpecified { 
      get { 
       return this.priceStddevFieldSpecified; 
      } 
      set { 
       this.priceStddevFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 21)] 
     public string volOut { 
      get { 
       return this.volOutField; 
      } 
      set { 
       this.volOutField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 22)] 
     public decimal volRange { 
      get { 
       return this.volRangeField; 
      } 
      set { 
       this.volRangeField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 23)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool volRangeSpecified { 
      get { 
       return this.volRangeFieldSpecified; 
      } 
      set { 
       this.volRangeFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 24)] 
     public decimal volStddev { 
      get { 
       return this.volStddevField; 
      } 
      set { 
       this.volStddevField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElement(Order = 25)] 
     [System.Xml.Serialization.XmlIgnoreAttribute()]   
     public bool volStddevSpecified { 
      get { 
       return this.volStddevFieldSpecified; 
      } 
      set { 
       this.volStddevFieldSpecified = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order =26)]   
     public string contributors { 
      get { 
       return this.contributorsField; 
      } 
      set { 
       this.contributorsField = value; 
      } 
     } 
    } 

回答

3

我在實體類的每個屬性的頂部使用了XmlElement [Order = n]。所以,在玩弄順序之後,我可以做這個序列化的工作。繼承和部分類使這個修復更加困難!謝謝。

0

XmlSerializer的生成聲明的順序的元素在類 - 可你只需要改變的實體的順序?

+0

我做過了,但同樣的行爲。謝謝。 – Jimmy

+0

你可以添加類定義和序列化的XML到你的問題,所以我們有更多的細節? –

+0

OK。只是一個簡單的問題。訂單屬性值是從0還是1開始的?謝謝。 – Jimmy

相關問題