我有一个场景,其中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请求中存在的两个CuteRequest对象。但我得到以下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中 (包含每个参数标记。)
感谢您耐心阅读了这篇文章。任何帮助将不胜感激,因为几个小时的谷歌搜索被证明是徒劳的。
的问候,