1

私は次のような基本クラスを持っています:

[Serializable]
public class SerializableDomainObject<T>
{
    public SerializableDomainObject()
    {
        ID = Guid.NewGuid();
    }

    [DataMember(Name="ID", Order = 0)]
    public Guid ID { get; private set; }

    public void Save()
    {
        // serialize
    }

    public void Load()
    {
        // deserialize
    }
}

次に、これから派生したクラスがたくさんあります。その一例を次に示します。

[DataContract(Name="MyDomainObject")]
public class MyDomainObject : SerializableDomainObject<MyDomainObject>
{
    public MyDomainObject()
    {
    }

    public MyDomainObject(string name)
    {
        Name = name;
    }

    [DataMember(Order = 1)]
    public string Name { get; private set; }
}

ここでシリアル化されると、出力は次のようになります。

<MyDomainObject xmlns="http://schemas.datacontract.org/2004/07/DomainObjects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <_x003C_ID_x003E_k__BackingField>2b3c00f6-1b15-4a6b-bd6c-a1f447ea5a34</_x003C_ID_x003E_k__BackingField>
    <Name>AName</Name>
</MyDomainObject>

基本クラスのDataMember属性で指定した名前でIDプロパティがシリアル化されないのはなぜですか?

4

2 に答える 2

3

これは、プロパティのセッターをprivate-として宣言したためです。これはプライベートであるため、DataContractSerializerはバッキングフィールドをシリアル化し、プロパティではなくその名前を使用しています。

DataContractSerializerは、言語のセマンティクスに関して、要求されたすべてのメンバーを喜んでシリアル化します。サービスとクライアント間のメッセージコントラクトは単純で使いやすいものでなければならないため、通常は、このような可視性の制御をあまり行わずに、データコントラクトを単純に宣言するのが最善です。オープンで無制限のデータコントラクトを作成しますが、運用コントラクトをロックダウンします。

于 2010-02-02T14:40:27.023 に答える
-1

private 宣言を internal に変更してみてください。それでも可視性のニーズを満たしますか? 私は契約にそれを持っており、物事は非常にうまくシリアライズ/デシリアライズされます。

于 2010-02-02T14:55:26.843 に答える