12

DataContractJsonSerializer を使用していますが、DataMember 名に問題があります。

基本クラスといくつかの派生クラスを作成しました。json 文字列が異なるため、派生クラスが必要です。json 文字列をデシリアライズしたいので、データメンバーに別の名前が必要です。次の例のように、DataMember 名を変更しようとしました。

ベースクラス:

[DataContract]
public abstract class BaseClass
{


    [DataMember]
    public virtual string FirstMethod { get; protected set; }

}

派生クラス:

[DataContract]
[KnownType(typeof(BaseAccess))]
public class DerivedClass
{


    [DataMember(Name="first_method")]
    public virtual string FirstMethod { get; protected set; }

}

問題は、派生クラスを使用すると、シリアライゼーションが指定された DataMember 名を無視するように見えることです。そのため、DerivedClass 型で逆シリアル化すると、(派生クラスの) "first_method" ではなく、(基本クラスの) "FirstMethod" という名前でシリアル化が行われるようです。派生クラスの DataMember 名を使用することは可能ですか (私の状況ではいくつかの派生クラスで異なります)。

別の質問です。基本クラスに追加され、派生クラスに追加された KnownType の例を見つけました。派生クラスでそれを行うのは私にとって論理のようです(特に継承の問題の場合)。何が正しいですか?

4

2 に答える 2

7

これと同じ問題がありました。私は VB.NET を使用していましたが、プロパティをシャドウ (またはオーバーロード) して、派生クラスの DataMember プロパティを尊重するように WCF を取得する必要がありました。C# では、new 演算子を使用できるはずです。

public class DerivedClass
{
    [DataMember(Name = "first_method")]
    new public string FirstMethod { get; protected set; }
}
于 2012-01-13T21:44:20.800 に答える
4

秘訣はEmitDefaultValue = false、基本クラスの仮想データメンバーを指定することです。派生クラスでの実装では、データメンバーがシリアル化されないように、デフォルト値を返します。派生クラスで、必要な名前の別のデータメンバーを定義します。

[DataContract(Name = "baseclass", Namespace = "")]
[KnownType(typeof(DerivedClass))]
public class BaseClass
{
    [DataMember(Name = "attributes", EmitDefaultValue = false)]
     public virtual SomeType Fields { get; set; }
}

[DataContract(Name = "derivedclass", Namespace = "")]
public class DerivedClass : BaseClass
{
    public override SomeType Fields
    {
        get { return null; }
    }

    [DataMember(Name = "fields")]
    public SomeType DerivedFields
    {
        get { return base.Fields; }
    }
}
于 2012-11-13T09:15:30.957 に答える