今回は、C#でDictionaryをシリアル・逆シリアル化(XML変換)する方法を解説していきます。
目次
スポンサーリンク
Dictionaryをシリアル化するクラス
まずは、Dictionaryをシリアル化するクラスを作成しました。
fileNameにXMLファイルを指定することでシリアル化されます。
/// <summary>
/// シリアル化(オブジェクト→XML変換)
/// </summary>
static void Serialize()
{
// 保存先のファイル名
string fileName = Path.Combine(Directory.GetCurrentDirectory(), "sample.xml");
// 保存するクラス(TestClass)のインスタンスを作成
TestClass obj = new TestClass();
// DataContractSerializerオブジェクトを作成
// オブジェクトの型を指定する
DataContractSerializer serializer = new DataContractSerializer(typeof(TestClass));
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new System.Text.UTF8Encoding(false);
XmlWriter xw = XmlWriter.Create(fileName, settings);
// シリアル化し、XMLファイルに保存する
serializer.WriteObject(xw, obj);
// ファイルを閉じる
xw.Close();
}
逆シリアル化するクラス
逆シリアル化は以下のクラスからできます。
/// <summary>
/// 逆シリアル化(XML→オブジェクト変換)
/// </summary>
static void Deserialize()
{
// 保存先のファイル名
string fileName = Path.Combine(Directory.GetCurrentDirectory(), "sample.xml");
// DataContractSerializerオブジェクトを作成
DataContractSerializer serializer = new DataContractSerializer(typeof(TestClass));
// 読み込むファイルを開く
XmlReader xr = XmlReader.Create(fileName);
// XMLファイルから読み込み、逆シリアル化する
TestClass obj = (TestClass)serializer.ReadObject(xr);
// ファイルを閉じる
xr.Close();
}
Dictionaryをシリアル・逆シリアル化してみた
サンプルコード
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
namespace DictionaryToXmlSmaple
{
/// <summary>
/// XMLファイルに保存するオブジェクトのためのクラス
/// </summary>
[DataContract]
public class TestClass
{
[DataMember]
public int Number;
// DataMemberAttributeが無いのでシリアル化されない
public string Name;
// プライベートでもDataMemberAttributeがあればシリアル化される
[DataMember]
private string Age;
// コンストラクタ
public TestClass()
{
this.Number = 10;
this.Name = "ほげほげ先輩";
this.Age = "99歳";
}
// コンストラクタ
public TestClass(int num, string name, string age)
{
this.Number = num;
this.Name = name;
this.Age = age;
}
}
class Program
{
static void Main(string[] args)
{
// シリアル化(オブジェクト→XML変換)
Serialize();
// 逆シリアル化(XML→オブジェクト変換)
Deserialize();
}
/// <summary>
/// シリアル化(オブジェクト→XML変換)
/// </summary>
static void Serialize()
{
// 保存先のファイル名
string fileName = Path.Combine(Directory.GetCurrentDirectory(), "sample.xml");
// 保存するクラス(TestClass)のインスタンスを作成
TestClass obj = new TestClass();
// DataContractSerializerオブジェクトを作成
// オブジェクトの型を指定する
DataContractSerializer serializer = new DataContractSerializer(typeof(TestClass));
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new System.Text.UTF8Encoding(false);
XmlWriter xw = XmlWriter.Create(fileName, settings);
// シリアル化し、XMLファイルに保存する
serializer.WriteObject(xw, obj);
// ファイルを閉じる
xw.Close();
}
/// <summary>
/// 逆シリアル化(XML→オブジェクト変換)
/// </summary>
static void Deserialize()
{
// 保存先のファイル名
string fileName = Path.Combine(Directory.GetCurrentDirectory(), "sample.xml");
// DataContractSerializerオブジェクトを作成
DataContractSerializer serializer = new DataContractSerializer(typeof(TestClass));
// 読み込むファイルを開く
XmlReader xr = XmlReader.Create(fileName);
// XMLファイルから読み込み、逆シリアル化する
TestClass obj = (TestClass)serializer.ReadObject(xr);
// ファイルを閉じる
xr.Close();
}
}
}
実行結果
<?xml version="1.0" encoding="UTF-8"?>
<TestClass xmlns="http://schemas.datacontract.org/2004/07/DictionaryToXmlSmaple" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Age>99歳</Age>
<Number>10</Number>
</TestClass>
DataMemberAttribute
を付けていないNameは出力されません。
逆シリアル化したデータはobjに保存されます。
Formアプリでコマンドライン引数を読み込みたい場合はどうすればいい?
FormアプリだとMain
関数の引数がないので、明示的にコマンドライン引数を読み込む必要があります。
具体的にはSystem.Environment.CommandLine
、あるいはSystem.Environment.GetCommandLineArgs()
を使うことでコマンドライン引数を読み込むことができます。
サンプルコード
//コマンドライン引数を表示する
Console.WriteLine(System.Environment.CommandLine);
//コマンドライン引数を配列で取得する
string[] cmds = System.Environment.GetCommandLineArgs();
//コマンドライン引数を列挙する
foreach (string cmd in cmds)
{
Console.WriteLine(cmd);
}
実行結果
起動引数に /a /b "/c /d"
と割り当てた場合は以下のように表示されます。
/a
/b
/c /d
コメント