2013-07-16 24 views
6

Lasciatemi prefazione affermando che sono abbastanza nuovo in WCF e potrebbe utilizzare la terminologia sbagliata qui. Il mio progetto ha due componenti:Prevenire la serializzazione di membri Null in DataContractSerializer

  1. Una DLL che contiene le classi per l'attacco, estensione, ReportType1, e ReportType2
  2. Un WCF ServiceContract con un'OperationContract come descritto di seguito che deserializza come documento XML in oggetti rilevanti, quindi serializza di nuovo come JSON o XML di nuovo al client.

ho uno schema XML che è simile al seguente:

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

Seguendo questo schema, ho un documento XML del seguente tipo:

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

Ho la seguenti classi in una DLL compilata:

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 deserializza il documento XML in oggetti di cui sopra, e poi lo restituisce in formato JSON tramite il seguente OperationContract:

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

uscita effettiva come JSON

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

uscita effettiva come XML

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

Output desiderato come JSO N

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

output desiderato come XML

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

Le classi dalla DLL non hanno l'attributo DataContract, ma sembra di serializzare bene quando vengono inviati indietro dal mio OperationContract, come ho ottenere i risultati sopra.

Come posso dire di non serializzare gli elementi in JSON/XML se sono nulli senza avere la possibilità di trasformare le classi dalla DLL in una classe DataContract? Devo ereditare le classi dalla DLL e in qualche modo sovrascriverle come DataContract? In tal caso, come posso impostare gli attributi sui membri esistenti delle classi di base?

Per favore fatemi sapere se sono richieste ulteriori informazioni, e farò del mio meglio per fornirle.

+0

un'occhiata a [custom-serializzazione-con-DataContractSerializer] (http: // StackOverflow.it/questions/3156312/serializzazione personalizzata-con-datacontractserializer) Cordiali saluti. –

+0

Ho trovato [questa domanda SO] (http://stackoverflow.com/questions/5685045/how-to-not-return-null-when-a-data-member-field-is-not-set-in-the -data-contratto) che fa ciò che cerco, ma mi richiederebbe di decorare le classi nella DLL, che è al di fuori del mio scopo. Parte del problema qui non è in grado di modificare le classi presenti nella DLL. – crush

risposta

-1

È possibile creare una funzione con il modello ShouldSerialize {PropertyName} che indica a XmlSerializer se deve serializzare il membro o meno.

check this question