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
- DLL zawierający zajęcia do mocowania, Extension, ReportType1 i ReportType2
- 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ć.
rzucić okiem na [niestandardowym serializacji-z-DataContractSerializer] (http: // stackoverflow.com/questions/3156312/custom-serialization-with-datacontractserializer) Pozdrawiam. –
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