かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

System.Xamlを使ったシリアライズ・デシリアライズ

上から順に、単純なデシリアライズ。ローカルアセンブリを指定したデシリアライズ。文字列へのシリアライズ。文字列以外のストリームやテキストライターへのシリアライズです。

using System;
using System.IO;
using System.Reflection;
using System.Xaml;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            // 読み込み
            {
                // XAML
                var xaml = @"<Person xmlns='clr-namespace:ConsoleApplication5;assembly=ConsoleApplication5' Name='Tanaka' />";
                // 
                var r = new XamlXmlReader(new StringReader(xaml));
                // 読み込み
                var p = XamlServices.Load(r) as Person;
                // 確認
                Console.WriteLine(p.Name);
            }

            // 読み込み2
            {
                // XAML(LocalAssemblyを指定してるのでxmlnsにassembly指定がいらない)
                var xaml = @"<Person xmlns='clr-namespace:ConsoleApplication5' Name='Tanaka' />";
                // 
                var r = new XamlXmlReader(new StringReader(xaml), new XamlXmlReaderSettings
                {
                    LocalAssembly = Assembly.GetExecutingAssembly()
                });
                // 読み込み
                var p = XamlServices.Load(r) as Person;
                // 確認
                Console.WriteLine(p.Name);
            }

            // 書き込み
            {
                var xaml = XamlServices.Save(new Person { Name = "kimura" });
                Console.WriteLine(xaml);
            }
            // 書き込み2
            {
                var w = new StringWriter();
                XamlServices.Save(w, new Person { Name = "kimura" });
                Console.WriteLine(w.ToString());
            }

        }
    }

    // XAMLで保存するオブジェクト
    public class Person
    {
        public string Name { get; set; }
    }
}