2013-07-16 41 views
6

讓我先說我對WCF相當陌生,並且可能會在這裏使用錯誤的術語。我的項目有兩個組成部分:防止DataContractSerializer中的空成員序列化

  1. 一個包含附件類DLL,擴展,ReportType1和ReportType2
  2. 一個WCF的ServiceContract與OperationContract的如下面描述反序列化的XML文檔轉換成相關的對象,再序列它再次以JSON或XML的形式返回給客戶端。

我有一個類似如下的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; } 
} 

My WCF s ervice反序列化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> 

所需輸出爲JSO ñ

{ 
    'Attachment': { 
     'Extension': { 
      'ReportType1': { ... } 
     } 
    } 
} 

所需的輸出爲XML

<Attachment> 
    <Extension> 
     <ReportType1>...</ReportType1> 
    </Extension> 
</Attachment> 

從DLL類不具備DataContract屬性,但似乎序列化就好了,當從我OperationContract被髮送回,因爲我得到上述結果。

如何告訴它不要將元素序列化爲JSON/XML,如果它們爲空而無法將類從DLL轉換爲DataContract類?我應該從DLL中繼承類,並以某種方式覆蓋它們爲DataContract?如果是這樣,那麼我怎麼才能在基類的現有成員上設置屬性呢?

請讓我知道是否需要更多信息,我會盡我所能提供。

+0

看看[自定義序列化與 - DataContractSerializer的(HTTP://計算器。com/questions/3156312/custom-serialization-with-datacontractserializer) 此致敬禮。 –

+0

我發現[這個SO問題](http://stackoverflow.com/questions/5685045/how-to-not-return-null-when-a-data-member-field-is-not-set-in-the -data-contract),它完成了我之後的工作,但它需要我修飾DLL中的類 - 這超出了我的範圍。這裏的部分問題是無法修改DLL中的類。 – crush

回答

-1

你可以用模式ShouldSerialize {PropertyName}來創建一個函數,它告訴XmlSerializer它是否應該序列化成員。

check this question

相關問題