IXmlSerializable数组的XmlSerialization

时间:2014-01-02 14:48:52

标签: xml c#-4.0 xml-serialization ixmlserializable

我有一个场景,其中Request对象是XML Serailized并发送回TCP服务器进行处理。序列化由遗留框架完成。不用说,我无法在遗留框架中进行更改。 然而,遗留框架足够聪明,可以实现请求对象是否正在实现IXmlSerializable,在这种情况下,它需要接口的WriteXml方法进行序列化。 我想在手中保持最大程度地控制serailzation过程,因此我写了这样的RequestBase类:

  public abstract class RequestBase : IXmlSerializable
  {
    [XmlElement("Environment")]
    public string BaseEnvironment { get; set; }

    protected RequestBase()
    {
    }

    protected RequestBase(string environment, string image):this()
    {
      HaloEnvironment = environment;       
    }


    XmlSchema IXmlSerializable.GetSchema()
    {
      return null;
    }

    void IXmlSerializable.ReadXml(XmlReader reader)
    {
      throw new NotImplementedException();
    }

    void IXmlSerializable.WriteXml(XmlWriter writer)
    {
      WriteXml(writer);
    }   

    protected virtual void WriteXml(XmlWriter writer)
    {

    }

  }

这个课程就像人们想象的那样简单。任何请求对象都必须实现它。 示例请求类是这样的:

  [XmlRoot("MyCuteRoot")]
  public class CuteRequest : RequestBase
  {

    public string CuteName { get; set; }

    public CuteRequest ()
    {
    }


    protected override void WriteXml(XmlWriter writer)
    {
      writer.WriteStartElement("Parameters");
      writer.WriteStartElement("header");

      if (!string.IsNullOrWhiteSpace(BaseEnvironment ))
        writer.WriteElementString("Environment", BaseEnvironment );


      if (!string.IsNullOrWhiteSpace(CuteName ))
        writer.WriteElementString("CuteNode", CuteName );

      writer.WriteEndElement();//header
      writer.WriteEndElement();//Parameters
    }
 }

上面的课给了我以下的Xml:

<MyCuteRoot>
        <Parameters>
          <header>
            <Environment>Developer</Environment>
            <CuteNode>a2</CuteNode>
          </header>
        </Parameters>
      </MyCuteRoot>

到目前为止,太阳一直很明亮,因为这很有效,我很高兴。 然后出现了后端服务器开始期待它所谓的 BulkRequest 的情况。这些请求现在将作为集合进行集成。

我尝试使用以下BulkRequest类处理这种情况:

  public class BulkRequest:RequestBase
  {

    public IEnumerable<RequestBase> Requests { get; private set; }

    public BulkRequest(IEnumerable<RequestBase> requests)
    {
      if (requests == null)
        throw new ArgumentNullException("requests");
      Requests = requests;
    }

    public BulkRequest()
    {
    }

    protected override void WriteXml(XmlWriter writer)
    {
      foreach (RequestBase requestBase in Requests)
      {
        (requestBase as IXmlSerializable).WriteXml(writer);
      }
    }
  }

现在这不起作用。我想要一个像下面这样的xml:

<STPRequest>
      <MyCuteRequest>
       <Parameters>
          <header>
            <Environment>Developer</Environment>
            <CuteName>a2</CuteName>
          </header>
        </Parameters>
      </MyCuteRequest>
      <MyCuteRequest>
        <Parameters>
          <header>
            <Environment>Developer</Environment>
            <CuteName>a2</CuteName>
          </header>
        </Parameters>
      </MyCuteRequest>
</STPRequest>

这是针对Bulk请求中存在的两个C​​uteRequest对象。但我得到以下xml:

<STPRequest>
  <BulkRequest>
    <Parameters>
      <header>
        <Environment>Developer</Environment>
        <CuteName>a2</CuteName>
      </header>
    </Parameters>
    <Parameters>
      <header>
        <Environment>Developer</Environment>
        <CuteName>a2</CuteName>
      </header>
    </Parameters>
  </BulkRequest>
</STPRequest>

问题是两个:

  • 如何摆脱强行进入的“ BulkRequest ”标记。

  • 如何使项目的XmlRoot值(即MyCuteRequest)出现在Xml中 (包含每个参数标记。)

感谢您耐心阅读了这篇文章。任何帮助将不胜感激,因为几个小时的谷歌搜索被证明是徒劳的。

的问候,

0 个答案:

没有答案
相关问题