让我先说我对WCF很新,并且可能在这里使用错误的术语。我的项目有两个组成部分:
我有一个类似于以下内容的XML架构:
<?xml version="1.0" encoding="windows-1252"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="Attachment">
<xsd:complexType>
<xsd:all>
<xsd:element name="Extension" type="Extension" minOccurs="0" />
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:complexType>
<xsd:sequence name="Extension">
<xsd:any processContents="skip" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
遵循此架构,我有一个以下类型的XML文档:
<Attachment>
<Extension>
<ReportType1>
<Name>Report Type 1 Example</Name>
</ReportType1>
</Extension>
</Attachment>
我在已编译的DLL中有以下类:
public class Attachment
{
public Extension Extension { get; set; }
}
public class Extension
{
[XmlElement(ElementName = "ReportType1", IsNullable = false)]
public ReportType1 ReportType1 { get; set; }
[XmlElement(ElementName = "ReportType2", IsNullable = false)]
public ReportType2 ReportType2 { get; set; }
}
我的WCF服务将XML文档反序列化为上述对象,然后通过以下OperationContract以JSON格式返回它:
[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.WrappedRequest)]
Attachment Search();
实际输出为JSON
{
'Attachment': {
'Extension': {
'ReportType1': { ... },
'ReportType2': null
}
}
}
实际输出为XML
<Attachment>
<Extension>
<ReportType1>...</ReportType1>
<ReportType2 i:nil="true"></ReportType2>
</Extension>
</Attachment>
所需输出为JSON
{
'Attachment': {
'Extension': {
'ReportType1': { ... }
}
}
}
所需输出为XML
<Attachment>
<Extension>
<ReportType1>...</ReportType1>
</Extension>
</Attachment>
DLL中的类没有DataContract
属性,但是当我从OperationContract
发回时,似乎序列化很好,因为我得到了上述结果。
如果它们为null而没有将DLL中的类转换为DataContract
类的能力,我怎么能告诉它不要将元素序列化为JSON / XML?我应该从DLL继承类,并以某种方式将它们覆盖为DataContract
?如果是这样,我怎么能在基类的现有成员上设置属性呢?
如果需要更多信息,请告诉我,我会尽力提供。
答案 0 :(得分:-1)
您可以使用模式ShouldSerialize {PropertyName}创建一个函数,该模式告诉XmlSerializer它是否应该序列化成员。