前回につづき、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>
コメントをお書きください