6

私は WCF にかなり慣れていないため、ここで間違った用語を使用している可能性があることを前置きさせてください。私のプロジェクトには 2 つのコンポーネントがあります。

  1. Attachment、Extension、ReportType1、および ReportType2 のクラスを含む DLL
  2. 以下で説明する 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 のクラスには属性がありませんが、上記の結果が得られるため、DataContractmy から送り返されたときに問題なくシリアル化されるようです。OperationContract

クラスを DLL からクラスに変換する機能がなくても、要素が null の場合、要素を JSON/XML にシリアル化しないようにするにはどうすればよいDataContractですか? DLL からクラスを継承し、何らかの方法でそれらをオーバーライドする必要がありますDataContractか? もしそうなら、どうすれば基本クラスの既存のメンバーに属性を設定できますか?

さらに情報が必要な場合はお知らせください。提供できるよう最善を尽くします。

4

1 に答える 1

-1

メンバーをシリアル化する必要があるかどうかを XmlSerializer に通知するパターン ShouldSerialize{PropertyName} を使用して関数を作成できます。

この質問を確認してください

于 2016-11-23T02:43:07.703 に答える