1. ホーム
  2. c#

プライベートメンバーデータのシリアライズ

2023-11-17 16:11:32

質問

いくつかのプロパティを持つオブジェクトをXMLにシリアライズしようとしていますが、そのうちのいくつかは読み取り専用です。

public Guid Id { get; private set; }

クラスには[Serializable]を付け、ISerializableインターフェースを実装しています。

以下は、私のオブジェクトをシリアライズするために使用しているコードです。

public void SaveMyObject(MyObject obj)
{
    XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
    TextWriter tw = new StreamWriter(_location);
    serializer.Serialize(tw, obj);
    tw.Close();
}

残念ながら、1行目でこのメッセージで落ちてしまいます。

InvalidOperationExceptionは処理されませんでした。 Unable to generate a temporary class (result=1)です。 エラー CS0200: プロパティまたはインデクサ 'MyObject.Id' に割り当てることができません -- それは読み取り専用です。

Id プロパティを public に設定すると、正常に動作します。私が何かしているか、少なくともそれが可能かどうか、誰か私に教えてください。

どのように解決するのですか?

あなたは DataContractSerializer (ただし、xml属性は使用できません。xml要素のみです)。

using System;
using System.Runtime.Serialization;
using System.Xml;
[DataContract]
class MyObject {
    public MyObject(Guid id) { this.id = id; }
    [DataMember(Name="Id")]
    private Guid id;
    public Guid Id { get {return id;}}
}
static class Program {
    static void Main() {
        var ser = new DataContractSerializer(typeof(MyObject));
        var obj = new MyObject(Guid.NewGuid());
        using(XmlWriter xw = XmlWriter.Create(Console.Out)) {
            ser.WriteObject(xw, obj);
        }
    }
}

別の方法として IXmlSerializable を実装し、自分ですべてを行うこともできますが、この場合は XmlSerializer では動作しますが、少なくとも