2013-07-16 25 views
6

Pozwolę sobie wstępnie powiedzieć, że jestem całkiem nowy w WCF i mogę używać tutaj niewłaściwej terminologii. Mój projekt ma dwa składniki:Zapobieganie serializacji elementów pustych w DataContractSerializer

  1. DLL zawierający zajęcia do mocowania, Extension, ReportType1 i ReportType2
  2. WCF ServiceContract z OperationContract jak opisano poniżej deserializes jako dokumentu XML do odpowiednich obiektów, a następnie serializes to znowu jako JSON lub XML z powrotem do klienta.

Mam schematu XML, który wygląda tak:

<?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> 

następstwie tego schematu, mam dokumentu XML z następujących typów:

<Attachment> 
    <Extension> 
     <ReportType1> 
      <Name>Report Type 1 Example</Name> 
     </ReportType1> 
    </Extension> 
</Attachment> 

Mam następujących klas w skompilowanym 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 erwis deserializes dokument XML do powyższych obiektów, a następnie zwraca go w formacie JSON za pośrednictwem poniższego OperationContract:

[OperationContract] 
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.WrappedRequest)] 
Attachment Search(); 

Rzeczywiste wyprowadzane jako JSON

{ 
    'Attachment': { 
     'Extension': { 
      'ReportType1': { ... }, 
      'ReportType2': null 
     } 
    } 
} 

rzeczywistej produkcji jako XML

<Attachment> 
    <Extension> 
     <ReportType1>...</ReportType1> 
     <ReportType2 i:nil="true"></ReportType2> 
    </Extension> 
</Attachment> 

Pożądany wyjścia jak JSO N

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

pożądany wynik jako XML

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

Klasy z DLL nie mają atrybutu DataContract, ale wydaje się szeregować dobrze, gdy wysłany z powrotem z mojego OperationContract, jak ja uzyskać powyższe wyniki.

Jak mogę powiedzieć, aby nie serializować elementów do JSON/XML, jeśli są one zerowe, bez możliwości przekształcenia klas z biblioteki DLL na klasę DataContract? Czy powinienem dziedziczyć klasy z biblioteki DLL i jakoś nadpisać je jako DataContract? Jeśli tak, to jak mogę ustawić atrybuty na istniejących elementach klas bazowych?

Proszę dać mi znać, jeśli wymagane jest więcej informacji, i dołożę wszelkich starań, aby ją dostarczyć.

+0

rzucić okiem na [niestandardowym serializacji-z-DataContractSerializer] (http: // stackoverflow.com/questions/3156312/custom-serialization-with-datacontractserializer) Pozdrawiam. –

+0

Znalazłem [to pytanie SO] (http://stackoverflow.com/questions/5685045/how-to-not-return-null-when-a-data-member-field-is-not-set-in- -data-contract), który robi to, co robię, ale wymagałby ode mnie dekorowania klas w bibliotece DLL - co jest poza moim zakresem. Część problemu tutaj nie jest w stanie zmodyfikować klas, które są w DLL. – crush

Odpowiedz

-1

Można utworzyć funkcję za pomocą wzoru ShouldSerialize {propertyName} który opowiada XmlSerializer czy powinien serializacji elementu lub nie.

check this question