112

シリアル化可能なクラスがあり、クラスのプロパティの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 {}
    }
}

更新

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

4

5 に答える 5

64

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

または、 DataContractSerializerの使用に切り替えることもできます。これは、より柔軟性があります。

于 2012-11-15T15:53:06.253 に答える
10

MSDNドキュメントの「XMLシリアル化の概要」を参照してください。とりわけ、それは言う:

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

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シリアライザーによってシリアル化できる上記のタイプに加えて、IXmlSerializableインターフェイスを実装する任意のタイプをシリアル化および逆シリアル化できます。特に、これはXElementタイプとXDocumentタイプをシリアル化できることを意味します。

IXmlSerializableインターフェイス」を参照してください。

于 2012-11-15T16:13:42.760 に答える
6

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

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

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}
于 2012-11-15T16:05:00.750 に答える
2

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

于 2013-09-20T20:06:16.583 に答える
0

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

于 2012-11-15T15:56:24.340 に答える