かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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; }
    }
}