web-dev-qa-db-ja.com

セッターのないプロパティがシリアル化されないのはなぜですか

シリアライズ可能なクラスがあり、クラスのプロパティの1つがゲッターでGuidを生成します。このプロパティはセッターを実装せず、シリアル化中に無視されます。それはなぜですか?プロパティをシリアル化するには、常にセッターを実装する必要がありますか?.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
    }
}

空のセッターを実装してみましたが、正しくシリアル化されました。

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
        set {}
    }
}

更新

値が変更されないプロパティや、値が内部で生成されるプロパティをどのように定義する必要があるかを指摘できますか?

88

これはXmlSerializerの制限であり、読み取り専用プロパティをシリアル化しません。2番目の例で行ったことは、本質的にシリアル化するためのハックですが、後でシリアル化を解除する必要がある場合は役に立ちません。

あるいは、 DataContractSerializer を使用するように切り替えることもできます。これはより柔軟です。

54
James

MSDNドキュメントの「 Introducing XML Serialization 」を参照してください。とりわけ、それは言います:

シリアル化できるアイテム

以下の項目は、XmlSerializerクラスを使用してシリアル化できます。

Public read/write properties and fields of public classes.

Classes that implement ICollection or IEnumerable.

注意:

Only collections are serialized, not public properties.
XmlElement objects.

XmlNode objects.

DataSet objects.

また、「 なぜXML-Serializableクラスにパラメーターなしのコンストラクターが必要なのか 」を参照してください


また、IXmlSerializable

XML Serializerでシリアル化できる上記の型に加えて、IXmlSerializableインターフェイスを実装する任意の型をシリアル化および逆シリアル化できます。特に、これはXElement型とXDocument型をシリアル化できることを意味します。

IXmlSerializable Interface 」を参照してください。

9
John Saunders

XMLSerializerの制限-セッターのないプロパティはシリアル化できません。

ただし、DataContractSerializerを使用してprivate setter propertiesをシリアル化できます-

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}
6
Rohit Vats

プライベートセッターを使用し、オブジェクトをシリアル化/非シリアル化できるようにし、ISerializableを実装し、MyObject(SerializationInfo info、StreamingContext context)のようなコンストラクターを作成する場合。 例はここにあります

2
edamon

シリアル化属性は、オブジェクトのシリアル化と逆シリアル化に使用されます。 XmlSerializerは、セッターを持たないプロパティをシリアル化する必要がないと想定します。オブジェクトのインスタンスを作成し、セッターを使用してプロパティ値を入力する必要があるため、文字列をオブジェクトに逆シリアル化するときにセッターが使用されます。

0
Rui Jarimba