防止DataContractSerializer中的null成员序列化

时间:2013-07-16 14:30:10

标签: c# wcf xml-serialization .net-4.5 datacontractserializer

让我先说我对WCF很新,并且可能在这里使用错误的术语。我的项目有两个组成部分:

  1. 包含Attachment,Extension,ReportType1和ReportType2
  2. 类的DLL
  3. 带有如下所述的OperationContract的WCF ServiceContract,它将XML文档反序列化为相关对象,然后将其作为JSON或XML再次序列化回客户端。
  4. 我有一个类似于以下内容的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?如果是这样,我怎么能在基类的现有成员上设置属性呢?

    如果需要更多信息,请告诉我,我会尽力提供。

1 个答案:

答案 0 :(得分:-1)

您可以使用模式ShouldSerialize {PropertyName}创建一个函数,该模式告诉XmlSerializer它是否应该序列化成员。

check this question