【发布时间】:2010-09-22 14:18:35
【问题描述】:
这是我在一个包含 200 多个此类条目的巨大 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;
使用 System.Collections.Generic; 使用 System.Text; 使用 System.IO; 使用 System.Xml.Serialization;
命名空间反序列化XML { 公开课程序 {
// 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:\\test.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);
}
}
}
}
当我执行它时,我只在控制台上看到“Reading with Stream”,没有别的。
编辑
我刚刚意识到我只说“阅读流”,因为它仍在阅读。大约 5 秒后,这就是我得到的:
Unhandled Exception: System.InvalidOperationException: DeserializeXML.Program is
inaccessible due to its protection level. Only public types can be processed.
at System.Xml.Serialization.TypeDesc.CheckSupported()
at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo sourc
e, Boolean directReference, Boolean throwOnError)
at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo me
mberInfo, Boolean directReference)
at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo sourc
e, Boolean directReference, Boolean throwOnError)
at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean direct
Reference)
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type
, XmlRootAttribute root, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultName
space)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)
at DeserializeXML.Program.Test.DeserializeObject(String filename) in c:\docum
ents and settings\sobti\my documents\visual studio 2010\Projects\DeserializeXML\
DeserializeXML\Program.cs:line 109
at DeserializeXML.Program.Test.Main() in c:\documents and settings\sobti\my d
ocuments\visual studio 2010\Projects\DeserializeXML\DeserializeXML\Program.cs:li
ne 102
编辑
公开我的 Program 类后,我现在收到此错误:
Unhandled Exception: System.InvalidOperationException: There was an error reflec
ting type 'DeserializeXML.Program.TradeFill'. ---> System.InvalidOperationExcept
ion: There was an error reflecting field 'GroupTransId'. ---> System.InvalidOper
ationException: The XML element 'qwGroupTransId' from namespace '' is already pr
esent in the current scope. Use XML attributes to specify another XML name or na
mespace for the element.
at System.Xml.Serialization.XmlReflectionImporter.AddUniqueAccessor(INameScop
e scope, Accessor accessor)
at System.Xml.Serialization.XmlReflectionImporter.AddUniqueAccessor(MemberMap
ping member, INameScope elements, INameScope attributes, Boolean isSequence)
at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(Str
uctMapping mapping, StructModel model, Boolean openModel, String typeName, Recur
sionLimiter limiter)
编辑
对我的代码进行了一系列更改(如上所示)。有一些项目列出了两次,双重检查案例等。我现在收到此错误:
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 ---
【问题讨论】:
-
你的 qwGroupTransId 在课堂上列出了两次。
-
您可能会考虑将这些问题分解为单独的问题?它变成了一个非常长的帖子,每次编辑似乎都是它自己的问题......
标签: c# .net xml xml-serialization