normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

C#でのデシリアライズ系

最近は設定関連をXMLで記述するのがはやっている模様。大体は、以下の手順で行っているはず。

  1. 設定ファイル等をXML形式で保存している
  2. 設定ファイル用のDTO相当のクラスを作る
  3. DTO相当のクラスに対して、設定ファイルをデシリアライズする

というわけで、必要な物は「設定ファイル(xmlファイル)」と「DTO相当のクラス(*.csファイル)」というわけです。

シンプル例

  • 実行コード
using System;
using System.Xml.Serialization;
using System.IO;

using XmlReadSmp.Dto;
class Program
{
    static void Main(string[] args)
    {
        XmlSerializer xs = new XmlSerializer(typeof(MessageInfo));
        MessageInfo info = xs.Deserialize(new FileStream(@"XMLFile01.xml", FileMode.Open)) as MessageInfo;
        Console.WriteLine("info message = {0}", info.Message);
        //前はバカか!
    }
}
  • XMLFile01.xmlファイル
<?xml version="1.0" encoding="utf-8" ?>
<MessageInfo>
  <Message>お前はバカか!</Message>
  <Condition>不機嫌</Condition>
</MessageInfo>
  • SerializeDto.cs
using System;
using System.Collections.Generic;

namespace XmlReadSmp.Dto
{
    public class MessageInfo
    {
        public string Message{get;set;}
        public string Condition { get; set; }
    }
}

配列を含んでいる場合

配列を含んでいる場合についても実行してみます。基本的には「シンプル例」で使用したソースコードを拡張しています。

  • XMLFile02.xml
<?xml version="1.0" encoding="utf-8" ?>
<ListMessageInfo>
  <ListMessage>
    <MessageInfo>
      <Message>お前はバカか!</Message>
      <Condition>不機嫌</Condition>
    </MessageInfo>
    <MessageInfo>
      <Message>少しくらい優しくしてくれても良いじゃないか</Message>
      <Condition>寂しい</Condition>
    </MessageInfo>
    <MessageInfo>
      <Message>今日は元気だぞ</Message>
      <Condition>普通</Condition>
    </MessageInfo>
  </ListMessage>
  <Name>みやびー用</Name>
</ListMessageInfo>
  • SerializeDto.cs
public class ListMessageInfo
{
    public MessageInfo[] ListMessage { get; set; }
    public string Name { get; set; }
}
  • Program.cs
XmlSerializer xs = new XmlSerializer(typeof(ListMessageInfo));
ListMessageInfo listInfo = xs.Deserialize(new FileStream(@"App_Data/XMLFile02.xml", FileMode.Open)) as ListMessageInfo;
Console.WriteLine(listInfo.ListMessage[0].Message);
Console.WriteLine(listInfo.Name);
//お前はバカか!
//みやびー用