2010-09-22 117 views
0

這是XML文件的樣本,我試圖反序列化時遇到反序列化XML文件轉換成類對象

<TradeFills> 
<TradeFill> 
    <Broker>xxx</Broker> 
    <CustomerAccount/> 
    <qwFillTransID>xxxxxxxxxxxxxxxxxxx</qwFillTransID> 
    <qwPrevTransID>xxx</qwPrevTransID> 
    <qwGroupTransID>xxxxxxxxxxxxxxxxx</qwGroupTransID> 
    <GroupTransID>xxxxxxxx</GroupTransID> 
    <TransID>x</TransID> 
    <Service>xxxxxxxxxxxxxxxx</Service> 
    <Symbol>xx</Symbol> 
    <Exchange>xxxxx</Exchange> 
    <InstClass>xxxxxxxx</InstClass> 
    <InstSubClass>xxxxxxx</InstSubClass> 
    <ContractSymbol>xxxx</ContractSymbol> 
    <ExpirationDate>xxxxxxxx</ExpirationDate> 
    <Month>xx</Month> 
    <Year>xxxx</Year> 
    <Strike>xxx</Strike> 
    <TradePCU>xxxx</TradePCU> 
    <Buy>x</Buy> 
    <Quantity>xx</Quantity> 
    <Price>xxxxx</Price> 
    <FillTime>xxxxxxxxxxxxxxx</FillTime> 
    <PosUpdated>xxxxxxxxxxx</PosUpdated> 
    <Description/> 
</TradeFill> 
</TradeFills> 

這是我使用的代碼:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using System.Xml.Serialization; 

namespace DeserializeXML 
{ 
    public class Program 
    { 

     // This is the class that will be deserialized. 
     [Serializable()] 
     public class TradeFill 
     { 
      [XmlElement("Broker")] 
      public string broker; 

      [XmlElement("qwFillTransID")] 
      public string qwFillTransId; 

      [XmlElement("qwPrevTransID")] 
      public string qwPrevTransId; 

      [XmlElement("qwGroupTransID")] 
      public string qwGroupTransId; 

      [XmlElement("GroupTransID")] 
      public string GroupTransID; 

      [XmlElement("TransID")] 
      public string TransId; 

      [XmlElement("Service")] 
      public string Service; 

      [XmlElement("Exchange")] 
      public string Exchange; 

      [XmlElement("InstClass")] 
      public string InstClass; 

      [XmlElement("InstSubClass")] 
      public string InstSubClass; 

      [XmlElement("ContractSymbol")] 
      public string ConSymbol; 

      [XmlElement("ExpirationDate")] 
      public DateTime ExpDate; 

      [XmlElement("Month")] 
      public int month; 

      [XmlElement("Year")] 
      public int year; 

      [XmlElement("Strike")] 
      public double strike; 

      [XmlElement("TradePCU")] 
      public string TradePCU; 

      [XmlElement("Buy")] 
      public int buy; 

      [XmlElement("Quantity")] 
      public int quantity; 

      [XmlElement("Price")] 
      public double price; 

      [XmlElement("FillTime")] 
      public DateTime FillTime; 

      [XmlElement("PosUpdated")] 
      public string PosUpdated; 

     } 


     [XmlRootAttribute("TradeFills")] 
     public class SIGTrades 
     { 
      [XmlElement("TradeFills")] 
      public TradeFill[] TradeFills{ get; set; } 
     } 


     [Serializable()] 
     public class Test 
     { 
      public static void Main() 
      { 
       Test t = new Test(); 
       // Read a purchase order. 
       t.DeserializeObject("c:\\testtrades.xml"); 
      } 

      private void DeserializeObject(string filename) 
      { 
       Console.WriteLine("Reading with Stream"); 
       // Create an instance of the XmlSerializer. 
       XmlSerializer serializer = 
       new XmlSerializer(typeof(TradeFill)); 
       // Reading the XML document requires a FileStream. 
       Stream reader = new FileStream(filename, FileMode.Open); 

       // Declare an object variable of the type to be deserialized. 
       TradeFill i; 

       // Call the Deserialize method to restore the object's state. 
       i = (TradeFill)serializer.Deserialize(reader); 

       // Write out the properties of the object. 
       Console.Write(i.qwFillTransId); 
      } 



     } 


    } 
} 

這是錯誤我在運行時得到:

Unhandled Exception: System.InvalidOperationException: There is an error in XML 
document (2, 2). ---> System.InvalidOperationException: <TradeFills xmlns=''> wa 
s not expected. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderTradeF 
ill.Read3_TradeFill() 
    --- End of inner exception stack trace --- 

任何幫助,將不勝感激。我對c#和XML不熟悉,並且不確定哪裏出錯。

+0

問題在我的代碼或是XML文件?另外,是不是它搞砸了標籤?我不確定爲什麼那個標籤在那裏。 – xbonez 2010-09-22 14:51:50

回答

1

你應該反序列化基礎上,TradeFills型 - 的TradeFill類型。畢竟你的XML定義了一個TradeFills的實例!

所以,當你實例化你的解串器,使用

private void DeserializeObject(string filename) 
{ 
    Console.WriteLine("Reading with Stream"); 
    // Create an instance of the XmlSerializer. 
    XmlSerializer serializer = new XmlSerializer(typeof(TradeFills)); 
                 ********** 

TradeFills - 不TradeFill

0

我看到至少有兩個問題:

  • 你的XML文檔是無效的,它缺少XML聲明:

  • 你的XML顯然包含TradeFill對象的集合,而你爲typeof(TradeFill)創建XmlSerializer。您需要創建typeof(TradeFill[])串行器(或typeof(List<TradeFill>),或者一些其他集合型):

      XmlSerializer serializer = new XmlSerializer(typeof(TradeFill[]), new XmlRootAttribute("TradeFills")); 
         // Reading the XML document requires a FileStream. 
         Stream reader = new FileStream(filename, FileMode.Open); 
    
         // Declare an object variable of the type to be deserialized. 
         TradeFill[] tradeFills; 
    
         // Call the Deserialize method to restore the object's state. 
         tradeFills = (TradeFill[])serializer.Deserialize(reader); 
    

注意使用XmlRootAttribute指定根元素:如果沒有指定,默認的根元素將是「ArrayOfFillItem」