私は WCF にかなり慣れていないため、ここで間違った用語を使用している可能性があることを前置きさせてください。私のプロジェクトには 2 つのコンポーネントがあります。
- Attachment、Extension、ReportType1、および ReportType2 のクラスを含む DLL
- 以下で説明する OperationContract を含む WCF ServiceContract は、XML ドキュメントとして関連するオブジェクトに逆シリアル化し、JSON または XML として再度シリアル化してクライアントに返します。
次のような XML スキーマがあります。
<?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>
このスキーマに従って、次のタイプの XML ドキュメントがあります。
<Attachment>
<Extension>
<ReportType1>
<Name>Report Type 1 Example</Name>
</ReportType1>
</Extension>
</Attachment>
コンパイルされた 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; }
}
私の WCF サービスは、XML ドキュメントを上記のオブジェクトに逆シリアル化し、次の OperationContract を介して JSON 形式で返します。
[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.WrappedRequest)]
Attachment Search();
JSONとしての実際の出力
{
'Attachment': {
'Extension': {
'ReportType1': { ... },
'ReportType2': null
}
}
}
XMLとしての実際の出力
<Attachment>
<Extension>
<ReportType1>...</ReportType1>
<ReportType2 i:nil="true"></ReportType2>
</Extension>
</Attachment>
JSON としての目的の出力
{
'Attachment': {
'Extension': {
'ReportType1': { ... }
}
}
}
XMLとしての望ましい出力
<Attachment>
<Extension>
<ReportType1>...</ReportType1>
</Extension>
</Attachment>
DLL のクラスには属性がありませんが、上記の結果が得られるため、DataContract
my から送り返されたときに問題なくシリアル化されるようです。OperationContract
クラスを DLL からクラスに変換する機能がなくても、要素が null の場合、要素を JSON/XML にシリアル化しないようにするにはどうすればよいDataContract
ですか? DLL からクラスを継承し、何らかの方法でそれらをオーバーライドする必要がありますDataContract
か? もしそうなら、どうすれば基本クラスの既存のメンバーに属性を設定できますか?
さらに情報が必要な場合はお知らせください。提供できるよう最善を尽くします。