#freeze
[[.NET]]
これ、よくあるケースよねと思っていたら、ちゃんと先駆者がいたわ。以下ね。
- http://dobon.net/vb/dotnet/file/xmlserializer.html
ここはよくお世話になるんだけど、詳しすぎて自分の知りたいとこを探す羽目になるのが唯一の難点よね。今はまず使わない古いデータも入っているし。
なので、わたしの知りたいところ……要は読み書きしたいデータを簡単にXMLでやりとりするってとこだけを抜粋しようと思うの。
わたしが実現したいのは以下の点だけ。
- 実行ファイルと同じディレクトリにあるsample.xmlを読み込むと、必要なデータが揃う。
- 保存したいのは「ネタ元データファイル名」「データ群保存ディレクトリ名」が入ればいい。
- 配列とかはいらない。(あれば嬉しいけど必須ではない)
これを元に上のページを見ると、とても単純なものだけですみそうね。
それから、コードはこれかな?
まず、保存用のクラスを作るわ。
public class SampleClass
{
public int Number;
public string Message;
}
メインクラスの方のコードはこっちね。
//保存先のファイル名
string fileName = "sample.xml";
//保存するクラス(SampleClass)のインスタンスを作成
SampleClass obj = new SampleClass();
obj.Message = "テストです。";
obj.Number = 123;
//XmlSerializerオブジェクトを作成
//オブジェクトの型を指定する
System.Xml.Serialization.XmlSerializer serializer =
new System.Xml.Serialization.XmlSerializer(typeof(SampleClass));
//書き込むファイルを開く(UTF-8 BOM無し)
System.IO.StreamWriter sw = new System.IO.StreamWriter(
fileName, false, new System.Text.UTF8Encoding(false));
//シリアル化し、XMLファイルに保存する
serializer.Serialize(sw, obj);
//ファイルを閉じる
sw.Close();
で、生成されたファイルは、こんな感じになったわね。
<?xml version="1.0" encoding="utf-8"?>
<SampleClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Number>123</Number>
<Message>テストです。</Message>
</SampleClass>
数字はちゃんと自動で数値化されるんだ……。~
うん、これで使えそうね。
で、このファイルを読み込むには、こうやるの。
// 読み込み
System.Xml.Serialization.XmlSerializer serializer2 =
new System.Xml.Serialization.XmlSerializer(typeof(SampleClass));
//読み込むファイルを開く
System.IO.StreamReader sr = new System.IO.StreamReader(
fileName, new System.Text.UTF8Encoding(false));
//XMLファイルから読み込み、逆シリアル化する
SampleClass obj2 = (SampleClass)serializer2.Deserialize(sr);
//ファイルを閉じる
sr.Close();
わたしの環境だとこの後、obj2.Numberとobj2.Message をコンソールに出してみたりしてみたわ。ちやんといけるみたいね。
* 要注意 [#a3b2edd3]
Booleanやintも自動変換してくれるし便利なんだけど、ひとつだけ。
- ''XMLを手書きするなら、True でなく true じゃないとダメ(大文字だとエラーになる)''
うん、ちょっとそういうクセには要注意かも。