C# 如何将内部XML反序列化为对象?

C# 如何将内部XML反序列化为对象?,c#,xml,unit-testing,C#,Xml,Unit Testing,我有一个现有的XML文档,我正试图映射到一个C#类 我还创建了一个单元测试,以确保XML被反序列化 但是,当PageName元素的计数为2时,单元测试失败。调试时,我看到PageName元素计数为0。同样在debug视图中,单个DeskBroker.Broker元素的计数也为0 不确定是否正确设置了XML属性。有人能回顾一下我的作品,看看我是否使用了正确的注释吗?我肯定我错过了什么 多谢各位 这是XML: <?xml version="1.0" encoding="utf-8"?>

我有一个现有的XML文档,我正试图映射到一个C#类

我还创建了一个单元测试,以确保XML被反序列化

但是,当PageName元素的计数为2时,单元测试失败。调试时,我看到PageName元素计数为0。同样在debug视图中,单个DeskBroker.Broker元素的计数也为0

不确定是否正确设置了XML属性。有人能回顾一下我的作品,看看我是否使用了正确的注释吗?我肯定我错过了什么

多谢各位

这是XML:

<?xml version="1.0" encoding="utf-8"?>
<User>
 <FavoriteQuotePages>
  <Group name="Default">
   <PageName>NG Options</PageName>
   <PageName startdate="today" enddate="today">NG Options</PageName>
  </Group>
  <Group name="CUSTOM PAGES">
   <PageName sourcepagename="NG Options" daterange="TopDay" startdate="today" enddate="today" customfilters="[{&quot;fieldName&quot;:&quot;BidBOEName&quot;, &quot;expr&quot;:&quot;ION&quot;, &quot;cond&quot;:&quot;contains&quot;}]">ION ONLY</PageName>
   <PageName sourcepagename="NG Options" daterange="TopDay" startdate="today" enddate="today" customfilters="[{&quot;fieldName&quot;:&quot;BidBOEName&quot;, &quot;expr&quot;:&quot;CNG&quot;, &quot;cond&quot;:&quot;contains&quot;}]">CIE Only</PageName>
  </Group>
 </FavoriteQuotePages>
 <LayoutSettings>
  <PageDialog id="1" dialogname="market-page-dialog" modelname="MarketPageModel" viewname="_MarketPage" modelkey="" positionx="238.9965362548828" positiony="76.48611450195312" width="1275" height="650" />
 </LayoutSettings>
 <QuoteDefaults Product="NATURAL GAS">
  <ClearingEntities>
   <ID>12</ID>
  </ClearingEntities>
  <Quantity>100</Quantity>
  <ReserveQty></ReserveQty>
  <Timer>3</Timer>
  <DeskBrokers>
   <DeskBroker Desk="2366">
    <Broker Primary="False">2368</Broker>
   </DeskBroker>
   <DeskBroker Desk="2456">
    <Broker Primary="False">2657</Broker>
   </DeskBroker>
   <DeskBroker Desk="2302">
    <Broker Primary="False">2306</Broker>
   </DeskBroker>
   <DeskBroker Desk="2">
    <Broker Primary="False">82</Broker>
   </DeskBroker>
   <DeskBroker Desk="34">
    <Broker Primary="False">89</Broker>
   </DeskBroker>
   <DeskBroker Desk="64">
    <Broker Primary="False">15166</Broker>
   </DeskBroker>
  </DeskBrokers>
 </QuoteDefaults>
</User>

NG选项
NG选项
仅离子
仅限CIE
12
100
3.
2368
2657
2306
82
89
15166
我对XML的定义如下:

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

namespace TestApplication
{
  #region UserPreferences

  [XmlRoot("User")]
  public class UserPreferences
  {
    #region Private Static Members

    private static XmlSerializer m_xmlSerializer = new XmlSerializer(typeof(UserPreferences));

    #endregion

    #region Public Properties

    [XmlArray("FavoriteQuotePages")]
    public List<PageGroup> FavoriteQuotePages { get; set; }

    [XmlArray("LayoutSettings")]
    public List<PageDialogSettings> LayoutSettings { get; set; }

    public QuoteDefaultSettings QuoteDefaults { get; set; }

    #endregion

    #region Constructors

    public UserPreferences()
    {
      FavoriteQuotePages = new List<PageGroup>();
      LayoutSettings = new List<PageDialogSettings>();
      QuoteDefaults = new QuoteDefaultSettings();
    }

    #endregion

    #region XML Serialization Methods

    public static string SerializeFrom(UserPreferences userPreferences)
    {
      try
      {
        XmlSerializerNamespaces xns = new XmlSerializerNamespaces();
        xns.Add(string.Empty, string.Empty);
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.OmitXmlDeclaration = true;
        StringWriter writer = new StringWriter();
        XmlWriter xmlWriter = XmlWriter.Create(writer, settings);
        m_xmlSerializer.Serialize(xmlWriter, userPreferences, xns);
        String xml = writer.ToString();
        return xml;
      }
      catch (Exception ex)
      {
        throw ex;
      }
    }

    public static UserPreferences DeserializeFrom(string xml)
    {
      try
      {
        StringReader reader = new StringReader(xml);
        UserPreferences userPreferences = (UserPreferences)m_xmlSerializer.Deserialize(reader);
        return userPreferences;
      }
      catch (Exception ex)
      {
        throw ex;
      }
    }

    #endregion
  }

  #endregion

  #region PageGroup

  [XmlType("Group")]
  public class PageGroup
  {
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlArray("Group")]
    public List<Page> Pages { get; set; }

    public PageGroup()
    {
      Pages = new List<Page>();
    }
  }

  #endregion

  #region Page

  [XmlType("PageName")]
  public class Page
  {
    [XmlElement]
    public string Name { get; set; }

    [XmlAttribute("startdate")]
    public DateTime StartDate { get; set; }

    [XmlAttribute("enddate")]
    public DateTime EndDate { get; set; }

    [XmlAttribute("daterange")]
    public string DateRange { get; set; }

    [XmlAttribute("customfilters")]
    public string CustomFilters { get; set; }

    [XmlAttribute("sourcepagename")]
    public string SourcePageName { get; set; }
  }

  #endregion

  #region PageDialogSettings

  [XmlType("PageDialog")]
  public class PageDialogSettings
  {
    [XmlAttribute("id")]
    public int Id { get; set; }

    [XmlAttribute("dialogname")]
    public string DialogName { get; set; }

    [XmlAttribute("viewname")]
    public string ViewName { get; set; }

    [XmlAttribute("modelname")]
    public string ModelName { get; set; }

    [XmlAttribute("modelkey")]
    public string ModelKey { get; set; }

    [XmlAttribute("positionx")]
    public double PositionX { get; set; }

    [XmlAttribute("positiony")]
    public double PositionY { get; set; }

    [XmlAttribute("width")]
    public int Width { get; set; }

    [XmlAttribute("height")]
    public int Height { get; set; }
  }

  #endregion

  #region QuoteDefaultSettings

  [XmlType("QuoteDefaults")]
  public class QuoteDefaultSettings
  {
    [XmlAttribute("Product")]
    public string Product { get; set; }

    [XmlElement]
    public int Quantity { get; set; }

    [XmlElement]
    public int ReserveQuantity { get; set; }

    [XmlElement]
    public int Timer { get; set; }

    [XmlArray("ClearingEntities")]
    [XmlArrayItem("ID")]
    public List<long> ClearingEntityIds { get; set; }

    [XmlArray]
    public List<DeskBroker> DeskBrokers { get; set; }

    public QuoteDefaultSettings()
    {
      ClearingEntityIds = new List<long>();
      DeskBrokers = new List<DeskBroker>();
    }
  }

  #endregion

  #region DeskBroker

  [XmlType("DeskBroker")]
  public class DeskBroker
  {
    [XmlAttribute("Desk")]
    public long DeskId { get; set; }

    [XmlArray]
    public List<Broker> Brokers { get; set; }

    public DeskBroker()
    {
      Brokers = new List<Broker>();
    }
  }

  #endregion

  #region Broker

  [XmlType("Broker")]
  public class Broker
  {
    [XmlAttribute]
    public bool Primary { get; set; }

    public long Id { get; set; }
  }

  #endregion
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
命名空间测试应用程序
{
#区域用户首选项
[XmlRoot(“用户”)]
公共类用户首选项
{
#区域私有静态成员
私有静态XmlSerializer m_XmlSerializer=新XmlSerializer(typeof(UserPreferences));
#端区
#区域公共财产
[XmlArray(“FavoriteQuotePages”)]
公共列表FavoriteQuotePages{get;set;}
[XmlArray(“布局设置”)]
公共列表布局设置{get;set;}
公共QuoteDefaultSettings QuoteDefaults{get;set;}
#端区
#区域构造函数
公共用户首选项()
{
FavoriteQuotePages=新列表();
LayoutSettings=新列表();
QuoteDefaults=新的QuoteDefaultSettings();
}
#端区
#区域XML序列化方法
公共静态字符串序列化自(UserPreferences UserPreferences)
{
尝试
{
xns=新的XmlSerializerNamespaces();
添加(string.Empty,string.Empty);
XmlWriterSettings=新的XmlWriterSettings();
settings.Indent=true;
settings.OmitXmlDeclaration=true;
StringWriter编写器=新的StringWriter();
XmlWriter=XmlWriter.Create(writer,设置);
m_xmlSerializer.Serialize(xmlWriter,userPreferences,xns);
字符串xml=writer.ToString();
返回xml;
}
捕获(例外情况除外)
{
掷骰子;
}
}
公共静态用户首选项反序列化自(字符串xml)
{
尝试
{
StringReader=新的StringReader(xml);
UserPreferences UserPreferences=(UserPreferences)m_xmlSerializer;
返回用户偏好;
}
捕获(例外情况除外)
{
掷骰子;
}
}
#端区
}
#端区
#区域页面组
[XmlType(“集团”)]
公共类页面组
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlArray(“组”)]
公共列表页{get;set;}
公共页面组()
{
Pages=新列表();
}
}
#端区
#区域页面
[XmlType(“PageName”)]
公共类页面
{
[XmlElement]
公共字符串名称{get;set;}
[XmlAttribute(“起始日期”)]
公共日期时间起始日期{get;set;}
[XmlAttribute(“结束日期”)]
公共日期时间结束日期{get;set;}
[XmlAttribute(“日期范围”)]
公共字符串日期范围{get;set;}
[XmlAttribute(“自定义过滤器”)]
公共字符串CustomFilters{get;set;}
[XmlAttribute(“sourcepagename”)]
公共字符串SourcePageName{get;set;}
}
#端区
#区域页面对话框设置
[XmlType(“PageDialog”)]
公共类页面对话框设置
{
[XmlAttribute(“id”)]
公共int Id{get;set;}
[XmlAttribute(“dialogname”)]
公共字符串对话框名称{get;set;}
[XmlAttribute(“视图名称”)]
公共字符串ViewName{get;set;}
[XmlAttribute(“modelname”)]
公共字符串ModelName{get;set;}
[XmlAttribute(“modelkey”)]
公共字符串ModelKey{get;set;}
[XmlAttribute(“位置X”)]
公共双位置x{get;set;}
[XmlAttribute(“位置”)]
公共双位置{get;set;}
[XmlAttribute(“宽度”)]
公共整数宽度{get;set;}
[XmlAttribute(“高度”)]
公共整数高度{get;set;}
}
#端区
#区域引用错误设置
[XmlType(“QuoteDefaults”)]
公共类QuotedFaultSettings
{
[XmlAttribute(“产品”)]
公共字符串乘积{get;set;}
[XmlElement]
公共整数数量{get;set;}
[XmlElement]
public int ReserveQuantity{get;set;}
[XmlElement]
公共整数计时器{get;set;}
[XmlArray(“clearingenties”)]
[XmlArrayItem(“ID”)]
公共列表ClearingTityId{get;set;}
[XmlArray]
公共列表{get;set;}
公共QuoteDefaultSettings()
{
ClearingEntityIds=新列表();
DeskBrokers=新列表();
}
}
#端区
#区域桌面代理
[XmlType(“DeskBroker”)]
公共类桌面代理
{
[XmlAttribute(“桌面”)]
公共长DeskId{get;set;}
[XmlArray]
公共列表代理{get;set;}
公共桌面代理()
{
代理=新列表();
}
}
#端区
#区域经纪人
[XmlType(“经纪人”)]
公共类经纪人
{
[XmlAttribute]
公共布尔主{get;set;}
公共长Id{get;set;}
}
#端区
}
单元测试:

using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestApplication
{
  [TestClass]
  public class UserPreferencesTests
  {
    [TestMethod]
    public void DeserializeExistingUserXml()
    {
      string filename = "user.xml";
      if (!File.Exists(filename))
      {
        throw new FileNotFoundException("Could not find file " + filename);
      }

      string xmlPreferences = File.ReadAllText(filename);
      DateTime startTime = DateTime.Now;
      UserPreferences preferences = UserPreferences.DeserializeFrom(xmlPreferences);
      TimeSpan duration = DateTime.Now.Subtract(startTime);

      Assert.IsTrue(duration.Milliseconds < 100, "The deseralization time took longer than 100ms: " + duration.Milliseconds + "ms");

      // Tests

      Assert.IsNotNull(preferences);
      Assert.AreEqual(2, preferences.FavoriteQuotePages.Count);

      var pageGroup = preferences.FavoriteQuotePages[0];
      Assert.AreEqual(2, pageGroup.Pages.Count);
      Assert.AreEqual("Default", pageGroup.Name);
      var page = pageGroup.Pages[0];
      Assert.AreEqual("NG Options", page.Name);
      page = pageGroup.Pages[1];
      Assert.AreEqual("NG Options", page.Name);

      pageGroup = preferences.FavoriteQuotePages[1];
      Assert.AreEqual(2, pageGroup.Pages.Count);
      Assert.AreEqual("CUSTOM PAGES", pageGroup.Name);

      Assert.AreEqual(1, preferences.LayoutSettings.Count);
      Assert.AreEqual(1, preferences.QuoteDefaults.ClearingEntityIds.Count);
      Assert.AreEqual(6, preferences.QuoteDefaults.DeskBrokers.Count);
    }
  }
}
使用系统;
使用System.IO;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
命名空间测试应用程序
{
[测试类]
公共类UserPreferencesTests
{
[测试方法]
public void反序列化existinguserxml()
{
字符串filename=“user.xml”;
如果(!File.Exists(filename))
{
抛出新的FileNotFoundException(“找不到文件”+文件名);
}
字符串xmlPreferences=File.ReadAllText(文件名);
日期时间开始时间
[XmlArray("Group")]
public List<Page> Pages { get; set; }
[XmlElement("PageName")]
public List<Page> Pages { get; set; }
[XmlType("Group")]
public class PageGroup
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("PageName")]
    public List<Page> Pages { get; set; }

    public PageGroup()
    {
        Pages = new List<Page>();
    }
}