■38784 / inTopicNo.3) |
Re[2]: XML出力について |
□投稿者/ やじゅ (1132回)-(2009/07/24(Fri) 22:33:14)
|
> ■No38758 (める さん) に返信
参考にしたサイト
C#::DictionaryをXMLSerializerでシリアライズしたいんですが?
http://d.hatena.ne.jp/lord_hollow/20090206/p1
XML シリアル化について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=30092&forum=7
XmlSerializerではできませんが、BinaryFormatterではシリアライズできます。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=16984&KLOG=34
XmlSerializerを使ってインスタンスをXML形式でシリアライズする
http://handcraft.blogsite.org/ComponentGeek/ShowArticle/60.aspx
■ソースリスト:
public class SerializableDictionary<Tkey, Tvalue> : Dictionary<Tkey, Tvalue>, IXmlSerializable
{
public System.Xml.Schema.XmlSchema GetSchema()
{
return null; //スキーマの定義はめんどくさいので省略
}
public void ReadXml(System.Xml.XmlReader reader)
{
XmlSerializer serializer = new XmlSerializer(typeof(KeyValue));
reader.Read();
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
KeyValue kv = serializer.Deserialize(reader) as KeyValue;
if (kv != null) Add(kv.Key, kv.Value);
}
reader.Read();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
XmlSerializer serializer = new XmlSerializer(typeof(KeyValue));
foreach (var key in Keys)
{
serializer.Serialize(writer, new KeyValue(key, this[key]));
}
}
public class KeyValue
{
public KeyValue() { }
public KeyValue(Tkey key, Tvalue value) { Key = key; Value = value; }
public Tkey Key { get; set; }
public Tvalue Value { get; set; }
}
}
public class SampleClass
{
public int codeNo;
public string codeName;
public List<string> subName = new List<string>();
}
private void button1_Click(object sender, EventArgs e)
{
//保存するSampleClassオブジェクトを作成
SerializableDictionary<string, SampleClass> dicSample = new SerializableDictionary<string, SampleClass>();
SampleClass myClass = new SampleClass();
myClass.codeNo = 1;
myClass.codeName = "Name1";
myClass.subName = new List<string>() { "A", "B" };
dicSample.Add("KEY1", myClass);
myClass = new SampleClass();
myClass.codeNo = 2;
myClass.codeName = "Name2";
myClass.subName = new List<string>() { "C", "D" };
dicSample.Add("KEY2", myClass);
System.Xml.XmlWriterSettings st = new System.Xml.XmlWriterSettings();
st.Encoding = System.Text.Encoding.UTF8;
st.Indent = true;
st.IndentChars = ("\t"); // Intentは不要ならコメントアウトしてね。
//書き込み
System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(@"C:\test.xml", st);
writer.WriteStartElement("Root");
dicSample.WriteXml(writer);
writer.WriteEndElement();
writer.Close();
//読み取り
dicSample.Clear();
System.Xml.XmlReader reader = System.Xml.XmlReader.Create(@"C:\test.xml");
reader.ReadStartElement("Root");
dicSample.ReadXml(reader);
reader.Close();
}
■Text.xmlの内容
<Root>
<KeyValueOfStringSampleClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Key>KEY1</Key>
<Value>
<codeNo>1</codeNo>
<codeName>Name1</codeName>
<subName>
<string>A</string>
<string>B</string>
</subName>
</Value>
</KeyValueOfStringSampleClass>
<KeyValueOfStringSampleClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Key>KEY2</Key>
<Value>
<codeNo>2</codeNo>
<codeName>Name2</codeName>
<subName>
<string>C</string>
<string>D</string>
</subName>
</Value>
</KeyValueOfStringSampleClass>
</Root>
|
|