C#のオブジェクトをXMLへシリアライズ その2

前回につづき、XMLへのシリアライズについて。

XmlAttributesをつかって細かな設定をしながらシリアライズする。

シリアライズしないフィールドを指定する

[XmlIgnore]属性を付けたフィールドはシリアライズされなくなる。

    public class TestClass
    {
        public  string ValueA;

        [XmlIgnore]
        public  int    ValueB;
    }

    ↓

<?xml version="1.0" encoding="utf-8"?>
<TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ValueA>テスト</ValueA>
</TestClass>

派生クラスなフィールドを出力する

[XmlElement] 属性を付けてフィールドの型を指定する事で派生クラスでもXML出力できる。

    public class TestBase
    {
        public string Name;
    }

    public class TestA : TestBase
    {
        public int ValueA;
    }

    public class TestB : TestBase
    {
        public int ValueB;
    }



    public class TestClass
    {
        [XmlElement(typeof(TestBase))]
        [XmlElement(typeof(TestA))]
        [XmlElement(typeof(TestB))]
        public TestBase Item;
    }






    public partial class MainWindow : Window
    {
        private void Test()
        {
            var testObj = new TestClass();
            testObj.Item = new TestB() { Name = "テスト", ValueB = 1 };

            var se = new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
            var sw = new System.IO.StreamWriter("d:\\test.xml", false, new System.Text.UTF8Encoding(false));
            se.Serialize(sw, testObj);
            sw.Close();
        }
    }

    ↓

<?xml version="1.0" encoding="utf-8"?>
<TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TestB>
    <Name>テスト</Name>
    <ValueB>1</ValueB>
  </TestB>
</TestClass>

派生クラスな配列フィールドを出力する

 [XmlArrayItem] 属性を付けてフィールドの型を指定する事で派生クラスでも配列を出力できる。

    public class TestBase
    {
        public string Name;
    }

    public class TestA : TestBase
    {
        public int ValueA;
    }

    public class TestB : TestBase
    {
        public int ValueB;
    }



    public class TestClass
    {
        [XmlArrayItem(typeof(TestBase))]
        [XmlArrayItem(typeof(TestA))]
        [XmlArrayItem(typeof(TestB))]
        public List<TestBase> Items;
    }






    public partial class MainWindow : Window
    {
        private void Test()
        {
            var testObj = new TestClass();
            testObj.Items = new List<TestBase>();
            testObj.Items.Add(new TestA() { Name = "テストA", ValueA = 1 });
            testObj.Items.Add(new TestB() { Name = "テストB", ValueB = 2 });

            var se = new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
            var sw = new System.IO.StreamWriter("d:\\test.xml", false, new System.Text.UTF8Encoding(false));
            se.Serialize(sw, testObj);
            sw.Close();
        }
    }

    ↓

<?xml version="1.0" encoding="utf-8"?>
<TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Items>
    <TestA>
      <Name>テストA</Name>
      <ValueA>1</ValueA>
    </TestA>
    <TestB>
      <Name>テストB</Name>
      <ValueB>2</ValueB>
    </TestB>
  </Items>
</TestClass>