昨夜まで、私は .NET のさまざまなライブラリを使用して XML を解析してきましXmlDocument
たXDocument
。なぜこれをもっと早く調べなかったのかはわかりませんが、クラスのシリアル化/逆シリアル化を無料で提供する何かが .NET で利用可能であるに違いないと思いました。もちろん、それはXmlSerializer
クラスの形式で提供されます。 .
案の定、数行のコードを使用することで、シリアライズとデシリアライズを簡単に行うことができました (ただし、現在書いているコードでは、デシリアライズするだけで済みます)。他のライブラリと必要な単体テストでこれを行う独自のクラスを作成します。しかし問題は、自分のプロパティを読み取り専用にしたいということです。セッターをプライベートにすると、XmlSerializer の作成時に次のエラーが発生します。
一時クラスを生成できません (結果 = 1)。エラー CS0200: プロパティまたはインデクサー 'MyProperty' を割り当てることができません -- 読み取り専用です
これは解決されない問題のように見えるため、回避策が必要です。
案の定、私はこの情報を見つけました。これは、自動プロパティを放棄してプライベート フィールドに戻るだけで、コードをコンパイルできることを示しています。残念ながら、これはコンパイルされますが、コードを実行すると、実際にはデータが逆シリアル化されません。アプリケーションを停止した後、メッセージ ウィンドウに次のようなエントリがいくつかあることに気付きました。
要素 'MyProperty' のスキーマ情報が見つかりませんでした。
これは、XmlSerializer がプライベート フィールドの処理方法を認識していないため、MyProperty に値を割り当てるコードがないためです!!!
StackOverflow で別の解決策DataContractSerializer
を提示する回答を見つけました。これは、これまで聞いたことのないa を使用することです。クラスに必要なコード変更を加えましたが、上記と同じメッセージが表示されました。念のためにコードを実行しましたが、XML が逆シリアル化されるときにクラス メンバーが設定されません。
私の特定のケースでは、それを吸ってメンバーが上書きされる(悪い)ことを許可するか、シリアライゼーション/デシリアライゼーションコードをすべて記述するという元のやり方に戻ると考えています自分。ここで私が間違っていることはありますか、それとも XmlSerializer のようなクラスが逆シリアル化中にクラスのプライベートメンバーを設定できるようにすることは不可能ですが、クラスの消費者はそのメンバーを上書きできませんか?
更新:プライベート プロパティの逆シリアル化を行う別の方法を示すさらに別の記事ですが、試してみたところ、動作しません。
以下は、逆シリアル化を試みたクラスの例です。
[Export]
[DataContract]
public class Configuration
{
[DataMember(Name="Port")]
private int _port;
public int Port { get { return _port; }}
}
結果: XmlSerializer で逆シリアル化するとエラーは発生しませんが、XML ファイルの Port 値が 1 の場合、_port と Port の値は 0 になります<Port>1</Port>
。
もう一つの例:
[Export]
public class Configuration
{
public int Port { get; set; }
}
結果: 正常にデシリアライズされますが、パブリック セッターは必要ありません。
次のようにクラスを逆シリアル化します。
XmlSerializer serializer = new XmlSerializer(typeof(Configuration));
FileStream reader = new FileStream( "config.xml", FileMode.Open);
Configuration Config = (Configuration)serializer.Deserialize( reader);
reader.Close();