1

.NET 4.0 WCF Web サービスを作成し、内部サーバーに配置しました。

現在、Web サービスを照会する単純なプロジェクトでこれをテストしています。

しかし、すべてのプロパティ名にk_BackingField文字列が追加されていることがわかりました。

    [System.Runtime.Serialization.DataMemberAttribute(Name="<WoNumber>k__BackingField", IsRequired=true)]
    public string WoNumberk__BackingField {
        get {
            return this.WoNumberk__BackingFieldField;
        }
        set {
            if ((object.ReferenceEquals(this.WoNumberk__BackingFieldField, value) != true)) {
                this.WoNumberk__BackingFieldField = value;
                this.RaisePropertyChanged("WoNumberk__BackingField");
            }
        }
    }

このk_BackingFieldパラメーターを検索したところ、このリンクが私の最良のリファレンスであることがわかりました。

シリアライザーに k__backingfield を置かないように命令する方法

どうやら、DataContractSerializerの代わりにXmlSerializerを使用したようです。

私が見つけられないように見えるのは、XmlSerializationを「元に戻す」方法とDataContractSerializerを有効にする方法です。

私のプロジェクトでは、プロジェクト全体で次の XML キーワードを検索しようとしましたが、それらはプルされていないようです。

  • XmlSerializerFormat
  • System.Xml.Serialization
  • XmlSerialzer

XmlSerializationを削除してから、 DataContractSerializerを使用してサービス参照を再度追加する方法を知っている人はいますか?

または、WCF サービスを変更して、必要なシリアライザーを公開する必要がありますか?

4

1 に答える 1

3

問題は、使用したことではありませんXmlSerializer-問題は、サービスの属性で宣言されたいくつかのクラスを使用していて[Serializable]、そのクラスの自動プロパティを使用していることです。

シリアライザーによって使用される属性で修飾された型のセマンティック[Serializable]は、そのフィールドが (プロパティではなく) シリアル化されることです。自動プロパティを使用すると、コンパイラは「バッキング フィールド」を生成し、サービスへのプロキシを作成する (サービス参照を追加する) と、デフォルトで、サーバー内のコントラクトと同等のデータ コントラクトを作成しようとします。

これを修正するには、サーバー側のコードを変更することにより、いくつかの選択肢があります。

  • を使用しないでください[Serializable]。代わりに[DataContract]モデルを使用します (これには、シリアル化するプロパティを装飾する必要があります)[DataMember]
  • キープ[Serializable]しますが、プロパティは使用せず、代わりにフィールドを使用してください
  • (該当する場合) POCO シリアル化を使用します (パブリック フィールド/プロパティはシリアル化されます)。属性は必要ありません。

もう 1 つの方法は、サーバーとクライアントの間でコントラクトを共有することです (つまり、[サービス参照の追加] を使用せず、データ/サービス コントラクトをサービス プロジェクトからクライアント プロジェクトにコピーします)。

于 2013-03-08T18:15:28.083 に答える