2013-07-16 7 views
6

Lassen Sie mich vorweg sagen, dass ich ziemlich neu in WCF bin und hier möglicherweise die falsche Terminologie verwende. Mein Projekt besteht aus zwei Komponenten:Verhindern der Serialisierung von Null-Membern in DataContractSerializer

  1. Eine DLL, die Klassen für Attachment enthält, Erweiterung, ReportType1 und ReportType2
  2. Ein WCF Servicecontract mit einer Operation wie unten beschriebener deserialisiert als XML-Dokument in die relevanten Objekte, dann serialisiert es wieder als entweder JSON oder XML zurück zum Client.

Ich habe ein XML-Schema, das wie folgt aussieht:

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

Nach diesem Schema habe ich ein XML-Dokument des folgenden Typs:

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

ich habe die folgende Klassen in einer kompilierten 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; } 
} 

Meine WCF s ervice deserialisiert das XML-Dokument in die oben genannten Aufgaben, und dann kehrt es im JSON-Format über die folgende Operation:

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

tatsächliche Ausgabe als JSON

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

tatsächliche Ausgabe als XML

Gewünschter Ausgang als JSO N

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

gewünschte Ausgabe als XML

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

Die Klassen aus der DLL nicht über das DataContract Attribut, sondern scheint ganz gut zu serialisiert, wenn von meinen OperationContract gesendet werden, wie ich Holen Sie sich die obigen Ergebnisse.

Wie kann ich sagen, dass die Elemente nicht in JSON/XML serialisiert werden sollen, wenn sie null sind, ohne dass die Klassen aus der DLL in eine DataContract Klasse umgewandelt werden können? Sollte ich die Klassen von der DLL erben und sie irgendwie als DataContract überschreiben? Wenn ja, wie könnte ich dann Attribute für die vorhandenen Mitglieder der Basisklassen setzen?

Bitte lassen Sie mich wissen, wenn weitere Informationen benötigt werden, und ich werde mein Bestes tun, um es zu liefern.

+0

haben einen Blick auf [custom-Serialisierung-mit-DataContractSerializer] (http: // Stackoverflow.com/fragen/3156312/custom-serialization-with-datacontractserializer) Grüße. –

+0

Ich fand [diese Frage SO] (http://stackoverflow.com/questions/5685045/how-to-not-return-null-when-a-data-member-field-is-not-set-in-the- -data-contract), die das tut, was ich möchte, aber es würde mich erfordern, die Klassen in der DLL zu dekorieren - was außerhalb meiner Reichweite liegt. Ein Teil des Problems besteht darin, dass die Klassen in der DLL nicht geändert werden können. – crush

Antwort

-1

Sie können eine Funktion mit dem Muster ShouldSerialize {PropertyName} erstellen, das dem XmlSerializer mitteilt, ob das Element serialisiert werden soll oder nicht.

check this question

Verwandte Themen