Save a tree as XML using XmlSerializer
在我的一个项目中,需要保存一个这样的树结构:
恰好,这个项目的开发语言是C#,这时我就想到了XmlSerializer,从网上找了一些教程,
最后总算圆满完成任务:
1: [XmlRoot("HotLines")]
2: public class HotLines
3: {
4: #region Constructor...
5: public HotLines()
6: {
7: Lines = new List<HotLine>();
8: LineGroups = new List<HotLines>();
9: }
10: #endregion
11:
12: #region Properties...
13: [XmlAttribute("Name")]
14: public string Name
15: {
16: get;
17: set;
18: }
19:
20: [XmlArray("Lines")]
21: [XmlArrayItem("Line", typeof(HotLine))]
22: public List<HotLine> Lines
23: {
24: get;
25: set;
26: }
27:
28: [XmlArray("LineGroups")]
29: [XmlArrayItem("Lines", typeof(HotLines))]
30: public List<HotLines> LineGroups
31: {
32: get;
33: set;
34: }
35: #endregion
36:
37: #region Utilities...
38: static public void SerializeToXML(HotLines lines, string fileName)
39: {
40: XmlSerializer serializer = new XmlSerializer(typeof(KingTools.HotLines));
41: TextWriter textWriter = new StreamWriter(fileName);
42: serializer.Serialize(textWriter, lines);
43: textWriter.Close();
44: }
45:
46: static public HotLines DeserializeFromXML(string fileName)
47: {
48: XmlSerializer deserializer = new XmlSerializer(typeof(KingTools.HotLines), new Type[] { typeof(HotLine) });
49: TextReader textReader = new StreamReader(fileName);
50: var lines = (HotLines)deserializer.Deserialize(textReader);
51: textReader.Close();
52: return lines;
53: }
54: #endregion
55: }
56:
57: [XmlRoot("Line")]
58: public class HotLine
59: {
60: #region Properties...
61: [XmlElement("File")]
62: public string File
63: {
64: get;
65: set;
66: }
67:
68: [XmlElement("Column")]
69: public int Column
70: {
71: get;
72: set;
73: }
74:
75: [XmlElement("Comment")]
76: public string Comment
77: {
78: get;
79: set;
80: }
81: #endregion
82: }
看看最终的代码,不得不为C#开发效率的高效而折服。用C++保存这样的一份数据,想想都怕,不知道其中要出多少幺蛾子。
下面是一份测试代码:
1: HotLines root = new HotLines();
2: root.Name = "Root";
3:
4: HotLine aLine = new HotLine();
5: aLine.Column = 10;
6: aLine.File = "Test";
7:
8: root.Lines.Add(aLine);
9:
10: HotLines group = new HotLines();
11: group.Name = "group";
12:
13: root.LineGroups.Add(group);
14: group.Lines.Add(aLine);
15:
16: string fileName = @"c:\lines.xml";
17: HotLines.SerializeToXML(root, fileName);
18:
19: var newRoot = HotLines.DeserializeFromXML(fileName);
20:
21: Assert.AreEqual(newRoot.Name, root.Name);
22: Assert.AreEqual(newRoot.Lines.Count, root.Lines.Count);
23: Assert.AreEqual(newRoot.LineGroups.Count, root.LineGroups.Count);
测试代码生成的XML如下:
1: <?xml version="1.0" encoding="utf-8"?>
2: <HotLines xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Root">
3: <Lines>
4: <Line>
5: <File>Test</File>
6: <Column>10</Column>
7: </Line>
8: </Lines>
9: <LineGroups>
10: <Lines Name="group">
11: <Lines>
12: <Line>
13: <File>Test</File>
14: <Column>10</Column>
15: </Line>
16: </Lines>
17: <LineGroups />
18: </Lines>
19: </LineGroups>
20: </HotLines>
代码说明一切,XmlSerializer 和 XML Attribute的便利不言自明。
posted on 2011-07-28 21:32 Jalen Wang 阅读(500) 评论(0) 编辑 收藏 举报