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
- Una DLL che contiene le classi per l'attacco, estensione, ReportType1, e ReportType2
- 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.
un'occhiata a [custom-serializzazione-con-DataContractSerializer] (http: // StackOverflow.it/questions/3156312/serializzazione personalizzata-con-datacontractserializer) Cordiali saluti. –
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