请问,在序列化 ResponseMessageEnvelope 类时,有什么方便的方法可以避免嵌套成员请求的命名空间属性吗?结果 xml 不会用于反序列化。
[XmlInclude(typeof(AuthenticateRequest))]
[XmlRoot("REQUEST",Namespace="")]
public abstract class BaseRequest
{
...
}
[XmlRoot("REQUEST", Namespace = "")]
public class AuthenticateRequest : BaseRequest
{
...
}
[XmlRoot("EXTSYSTEM", Namespace="")]
public class ResponseMessageEnvelope
{
public ResponseMessageEnvelope(BaseRequest request, BaseReponse response)
{
Request = request;
Response = response;
}
[XmlElement("REQUEST", Namespace = "")]
public Request.BaseRequest Request
{
get;
set;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
using (XmlWriter sWriter = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true ,Indent = true }))
{
XmlSerializer serializer = new XmlSerializer(typeof(ResponseMessageEnvelope));
serializer.Serialize(sWriter, this, ns);
return sb.ToString();
}
}
}
我在基和派生类上尝试了 XmlRoot 属性的空命名空间,也为成员上的 XmlElement 尝试了空命名空间,但没有成功。谢谢你的建议。
<EXTSYSTEM>
<REQUEST xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" p2:type="AuthenticateRequest">
...
</REQUEST>
....
</EXTSYSTEM>
这个我想要:
<EXTSYSTEM>
<REQUEST>
...
</REQUEST>
....
</EXTSYSTEM>
基类属性必须使用 know 类型进行修饰,以避免在输出中出现这些声明。将 ResponseMessageEnvelope 中的请求属性更改为
[XmlElement("REQUEST")]
[XmlElement(Type = typeof(AuthenticateRequest))]
public Request.BaseRequest Request
{
get;
set;
}
此外,在元素/根级别不需要命名空间 = "
最后,
我通过 XmlAttributeOverrides 解决问题:
[Serializable()]
public abstract class BaseRequest
{
...
}
[XmlRoot("EXTSYSTEM", Namespace="")]
public class ResponseMessageEnvelope
{
[XmlElement("REQUEST")]
public Request.BaseRequest Request
{
get;
set;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();
XmlElementAttribute attr = new XmlElementAttribute();
attr.ElementName = "REQUEST";
attr.Type = this.Request.GetType();
attr.Namespace = "";
attrs.XmlElements.Add(attr);
attrOverrides.Add(typeof(ResponseMessageEnvelope), "Request", attrs);
using (XmlWriter sWriter = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true ,Indent = true }))
{
XmlSerializer serializer = new XmlSerializer(typeof(ResponseMessageEnvelope), attrOverrides);
serializer.Serialize(sWriter, this, ns);
return sb.ToString();
}
}