【发布时间】:2019-08-15 11:54:44
【问题描述】:
我有一个动态创建的类型,所以我无法更改它的实现。我不能应用像
这样的解决方案[SoapInclude()]
想象一下,如果我有这样的课程:
public class BaseClass{}
public class DerivedClass:BaseClass{}
public class AnotherDerivedClass:BaseClass{}
public class RequestClass
{
public BaseClass item{get;set;}
}
如果我们尝试简单地序列化,我们会得到 DerivedClass 未找到的异常,因此我们必须覆盖 xmlattributes。
我已经设法覆盖我的类型并使用XmlAttributeOverrides 对其进行序列化,如下所示:
var requestObject = new RequestClass() {item = new DerivedClass()};
XmlAttributes attrs = new XmlAttributes();
XmlElementAttribute attr = new XmlElementAttribute
{
ElementName = "DerivedClass",
Type = typeof(DerivedClass)
};
attrs.XmlElements.Add(attr);
XmlAttributeOverrides attoverrides = new XmlAttributeOverrides();
attoverrides.Add(typeof(RequestClass), "item", attrs);
XmlSerializer sr = new XmlSerializer(typeof(RequestClass), attoverrides);
StringWriter writer = new StringWriter();
sr.Serialize(writer, requestObject);
var xml = writer.ToString();
现在上面的工作,但我想要将我的对象序列化为肥皂消息。我找到了与上面类似的类,例如SoapAttributeOverrides,我试图用这些类覆盖它,但它似乎不起作用。我试过了:
var requestObject = new RequestClass(){item = new DerivedClass()};
SoapAttributeOverrides ovr = new SoapAttributeOverrides();
SoapAttributes soapAtts = new SoapAttributes();
SoapElementAttribute element = new SoapElementAttribute();
element.ElementName = "DerivedClass";
ovr.Add(typeof(RequestClass), "item", soapAtts);
var sr = new XmlSerializer(new SoapReflectionImporter(ovr).ImportTypeMapping(typeof(RequestClass)));
StringWriter writer = new StringWriter();
sr.Serialize(writer, requestObject);
var xml = writer.ToString();
writer.Close();
我再次收到异常未找到 DerivedClass。我怎样才能给SoapElementAttribute 一个类似于XmlElementAttribute.Type 的类型,以便可以通过覆盖进行序列化以支持BaseClass 的多态性?
【问题讨论】:
标签: c# serialization soap