开心网外挂开发之 XML序列化于反序列化

通过昨天的文章我们已经了解了开发一个开心网的外挂所需要的最基本的东本,接下来的工作可以说基本上就上围绕这个基础来进行的,我写这一系列文章主要的目地不仅仅是为了让大家了解怎么开发开心网外挂,最主要的目过还是通过一个实例程序的编程,让初学者了解C#。

因为好多初学都看了很多基础性的东西,了解到了C#有好多特性, 但这些特性到底是干吗用的,或用了有什么好处了解的不够清楚,所以我在这一系列中,会陆续介绍

  1. XML序列化
  2. 泛型
  3. 设计模式的运用
  4. 多线程

等等这些都将会在我的程序中被运用到,今天先写XML序列化与反序列化,其实我的程序主要用到的是XML的反序列化,我们先了解一下XML序列化与反序列化是怎么回事

XML序列化与反序列化

MSDN中是这么说的:

序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。

在C#中XML 序列化中的中心类是 XmlSerializer 类,该类中最重要的方法是 SerializeDeserialize 方法。简单的示例我就不从MSDN中抄了, 大家了解了就行, 不了解去翻MSDN。下面我会到我们的程序, 为什么我们要用到序列化。

为什么我们需要XML序列化

我们先对开心网的各种操作进行分析,我把我会发现,开心网好多操作请求服务器后,服务器会返会一个XML格式的字符串。比如说,我们的花园信息,我们会发现,服务器端返回的是这么一个XML

 

ContractedBlock.gif ExpandedBlockStart.gif 开心网花园信息的XML
  1<conf>
  2  <account>
  3    <rank>23</rank>
  4    <ranktip>技能:23级再务农2天可升级</ranktip>
  5    <setting>
  6      <water>谢谢帮忙,你真是个大好人</water>
  7      <vermin>我感谢你八辈子祖宗,哈哈</vermin>
  8      <steal>敢偷我的,你等着!</steal>
  9      <farm>欢迎来我家花园务农!</farm>
 10      <dmsg></dmsg>
 11      <sleeptime>2</sleeptime>
 12    </setting>
 13    <cash>191万</cash>
 14    <logo50>http://img.kaixin001.com.cn/i/50_1_0.gif</logo50>
 15    <name>王楠</name>
 16    <cashtip>我的现金余额1913932</cashtip>
 17    <bkswf>http://img.kaixin001.com.cn/i2/house/garden/bk2_1.swf</bkswf>
 18    <ad></ad>
 19    <ad2></ad2>
 20    <bfirst>0</bfirst>
 21    <tcharms>939</tcharms>
 22    <careurl></careurl>
 23    <flowerwomanurl></flowerwomanurl>
 24    <flowerwomanmsg>王楠还不给我花婆婆发工资?#_#¥%</flowerwomanmsg>
 25    <beeurl></beeurl>
 26    <rainbowurl></rainbowurl>
 27    <ranchswf>http://img.kaixin001.com.cn//i2/house/ranch/animals/elephant5.swf</ranchswf>
 28  </account>
 29  <garden>
 30    <item>
 31      <water>5</water>
 32      <farmnum>1</farmnum>
 33      <vermin>0</vermin>
 34      <cropsid>0</cropsid>
 35      <fuid>-1</fuid>
 36      <status>1</status>
 37      <grass>0</grass>
 38      <shared>0</shared>
 39    </item>
 40    <item>
 41      <water>5</water>
 42      <farmnum>2</farmnum>
 43      <vermin>0</vermin>
 44      <cropsid>0</cropsid>
 45      <fuid>-1</fuid>
 46      <status>1</status>
 47      <grass>0</grass>
 48      <shared>0</shared>
 49    </item>
 50    <item>
 51      <water>5</water>
 52      <farmnum>3</farmnum>
 53      <vermin>0</vermin>
 54      <cropsid>0</cropsid>
 55      <fuid>-1</fuid>
 56      <status>1</status>
 57      <grass>0</grass>
 58      <shared>0</shared>
 59    </item>
 60    <item>
 61      <water>5</water>
 62      <farmnum>4</farmnum>
 63      <vermin>0</vermin>
 64      <cropsid>681856826</cropsid>
 65      <fuid>-1</fuid>
 66      <status>1</status>
 67      <grass>0</grass>
 68      <shared>0</shared>
 69      <pic>http://img.kaixin001.com.cn//i2/house/garden/crop2/renshen12.swf</pic>
 70      <fruitpic>http://img.kaixin001.com.cn//i2/house/garden/crop/renshen.swf</fruitpic>
 71      <picwidth>130</picwidth>
 72      <picheight>120</picheight>
 73      <cropsstatus>1</cropsstatus>
 74      <grow>73</grow>
 75      <totalgrow>120</totalgrow>
 76      <fruitnum>4</fruitnum>
 77      <seedid>21</seedid>
 78      <name>人参</name>
 79      <crops>生长阶段:61%&lt;br&gt;&lt;font size='12' color='#666666'&gt;再过1天2小时更大一些&lt;/font&gt;&lt;br&gt;距离收获:7天18小时&lt;br&gt;</crops>
 80      <farm>水:&lt;br&gt;第30季&lt;br&gt;</farm>
 81    </item>
 82    <item>
 83      <water>5</water>
 84      <farmnum>5</farmnum>
 85      <vermin>0</vermin>
 86      <cropsid>681858119</cropsid>
 87      <fuid>-1</fuid>
 88      <status>1</status>
 89      <grass>0</grass>
 90      <shared>0</shared>
 91      <pic>http://img.kaixin001.com.cn//i2/house/garden/crop2/renshen12.swf</pic>
 92      <fruitpic>http://img.kaixin001.com.cn//i2/house/garden/crop/renshen.swf</fruitpic>
 93      <picwidth>130</picwidth>
 94      <picheight>120</picheight>
 95      <cropsstatus>1</cropsstatus>
 96      <grow>73</grow>
 97      <totalgrow>120</totalgrow>
 98      <fruitnum>4</fruitnum>
 99      <seedid>21</seedid>
100      <name>人参</name>
101      <crops>生长阶段:61%&lt;br&gt;&lt;font size='12' color='#666666'&gt;再过1天2小时更大一些&lt;/font&gt;&lt;br&gt;距离收获:7天18小时&lt;br&gt;</crops>
102      <farm>水:&lt;br&gt;第34季&lt;br&gt;</farm>
103    </item>
104    <item>
105      <water>5</water>
106      <farmnum>6</farmnum>
107      <vermin>0</vermin>
108      <cropsid>0</cropsid>
109      <fuid>0</fuid>
110      <status>1</status>
111      <grass>0</grass>
112      <shared>1</shared>
113    </item>
114    <item>
115      <water>5</water>
116      <farmnum>7</farmnum>
117      <vermin>0</vermin>
118      <cropsid>0</cropsid>
119      <fuid>0</fuid>
120      <status>1</status>
121      <grass>0</grass>
122      <shared>1</shared>
123    </item>
124    <item>
125      <water>5</water>
126      <farmnum>8</farmnum>
127      <vermin>0</vermin>
128      <cropsid>0</cropsid>
129      <fuid>-1</fuid>
130      <status>1</status>
131      <grass>0</grass>
132      <shared>0</shared>
133    </item>
134    <item>
135      <water>5</water>
136      <farmnum>9</farmnum>
137      <vermin>0</vermin>
138      <cropsid>1573453690</cropsid>
139      <fuid>-1</fuid>
140      <status>1</status>
141      <grass>0</grass>
142      <shared>0</shared>
143      <pic>http://img.kaixin001.com.cn//i2/house/garden/crop1/lingzhi_2.swf</pic>
144      <fruitpic>http://img.kaixin001.com.cn//i2/house/garden/crop/lingzhi.swf</fruitpic>
145      <picwidth>130</picwidth>
146      <picheight>120</picheight>
147      <cropsstatus>1</cropsstatus>
148      <grow>2</grow>
149      <totalgrow>15</totalgrow>
150      <fruitnum>4</fruitnum>
151      <seedid>24</seedid>
152      <name>灵芝</name>
153      <crops>生长阶段:16%&lt;br&gt;&lt;font size='12' color='#666666'&gt;再过2小时43分再高一些&lt;/font&gt;&lt;br&gt;距离收获:2天2小时43分&lt;br&gt;</crops>
154      <farm>水:&lt;br&gt;第20季&lt;br&gt;</farm>
155    </item>
156    <item>
157      <water>5</water>
158      <farmnum>10</farmnum>
159      <vermin>0</vermin>
160      <cropsid>0</cropsid>
161      <fuid>0</fuid>
162      <status>1</status>
163      <grass>0</grass>
164      <shared>1</shared>
165    </item>
166    <item>
167      <water>5</water>
168      <farmnum>11</farmnum>
169      <vermin>0</vermin>
170      <cropsid>1354706925</cropsid>
171      <fuid>-1</fuid>
172      <status>1</status>
173      <grass>0</grass>
174      <shared>0</shared>
175      <pic>http://img.kaixin001.com.cn//i2/house/garden/crop/meigui_g_12.swf</pic>
176      <fruitpic>http://img.kaixin001.com.cn//i2/house/garden/crop/meigui_g.swf</fruitpic>
177      <picwidth>130</picwidth>
178      <picheight>120</picheight>
179      <cropsstatus>2</cropsstatus>
180      <grow>20</grow>
181      <totalgrow>20</totalgrow>
182      <fruitnum>4</fruitnum>
183      <seedid>29</seedid>
184      <name>绿玫瑰</name>
185      <crops>产量:4&lt;br&gt;剩余:4&lt;br&gt;&lt;font size='12' color='#666666'&gt;再过4天23小时44分枯死&lt;/font&gt;&lt;br&gt;</crops>
186      <farm>水:&lt;br&gt;第19季&lt;br&gt;</farm>
187    </item>
188    <item>
189      <water>5</water>
190      <farmnum>12</farmnum>
191      <vermin>0</vermin>
192      <cropsid>0</cropsid>
193      <fuid>0</fuid>
194      <status>1</status>
195      <grass>0</grass>
196      <shared>1</shared>
197    </item>
198    <item>
199      <water>5</water>
200      <farmnum>13</farmnum>
201      <vermin>0</vermin>
202      <cropsid>1354709177</cropsid>
203      <fuid>-1</fuid>
204      <status>1</status>
205      <grass>0</grass>
206      <shared>0</shared>
207      <pic>http://img.kaixin001.com.cn//i2/house/garden/crop/meigui_y_12.swf</pic>
208      <fruitpic>http://img.kaixin001.com.cn//i2/house/garden/crop/meigui_y.swf</fruitpic>
209      <picwidth>130</picwidth>
210      <picheight>120</picheight>
211      <cropsstatus>2</cropsstatus>
212      <grow>20</grow>
213      <totalgrow>20</totalgrow>
214      <fruitnum>6</fruitnum>
215      <seedid>35</seedid>
216      <name>黄玫瑰</name>
217      <crops>产量:6&lt;br&gt;剩余:6&lt;br&gt;&lt;font size='12' color='#666666'&gt;再过3天23小时44分枯死&lt;/font&gt;&lt;br&gt;</crops>
218      <farm>水:&lt;br&gt;第8季&lt;br&gt;</farm>
219    </item>
220    <item>
221      <water>5</water>
222      <farmnum>14</farmnum>
223      <vermin>0</vermin>
224      <cropsid>1533854914</cropsid>
225      <fuid>-1</fuid>
226      <status>1</status>
227      <grass>0</grass>
228      <shared>0</shared>
229      <pic>http://img.kaixin001.com.cn//i2/house/garden/crop1/lingzhi_5.swf</pic>
230      <fruitpic>http://img.kaixin001.com.cn//i2/house/garden/crop/lingzhi.swf</fruitpic>
231      <picwidth>130</picwidth>
232      <picheight>120</picheight>
233      <cropsstatus>1</cropsstatus>
234      <grow>5</grow>
235      <totalgrow>15</totalgrow>
236      <fruitnum>4</fruitnum>
237      <seedid>24</seedid>
238      <name>灵芝</name>
239      <crops>生长阶段:40%&lt;br&gt;&lt;font size='12' color='#666666'&gt;再过4小时11分长高一些&lt;/font&gt;&lt;br&gt;距离收获:1天12小时11分&lt;br&gt;</crops>
240      <farm>水:&lt;br&gt;第8季&lt;br&gt;</farm>
241    </item>
242    <item>
243      <water>5</water>
244      <farmnum>15</farmnum>
245      <vermin>0</vermin>
246      <cropsid>0</cropsid>
247      <fuid>0</fuid>
248      <status>0</status>
249      <grass>0</grass>
250      <shared>1</shared>
251    </item>
252  </garden>
253  <charmstips></charmstips>
254  <weatherurl>http://img.kaixin001.com.cn/swf/house/garden/weather0.swf</weatherurl>
255  <weather>0</weather>
256  <sky>http://img.kaixin001.com.cn/swf/house/garden/sky.swf</sky>
257  <ctime>1248082224</ctime>
258  <ploughurl>http://img.kaixin001.com.cn/swf/house/garden/ploughaward-1.swf</ploughurl>
259  <antiurl>http://img.kaixin001.com.cn/swf/house/smartq-1.swf</antiurl>
260  <shopurl>http://img.kaixin001.com.cn/swf/house/garden/shop-6.swf</shopurl>
261  <granaryurl>http://img.kaixin001.com.cn/swf/house/garden/granary-9.swf</granaryurl>
262  <settingurl>http://img.kaixin001.com.cn/swf/house/garden/setting-3.swf</settingurl>
263  <advanced>
264    <item>23</item>
265    <item>24</item>
266    <item>22</item>
267    <item>21</item>
268    <item>86</item>
269    <item>87</item>
270    <item>84</item>
271    <item>25</item>
272    <item>82</item>
273    <item>81</item>
274  </advanced>
275  <shahua>
276    <item>90</item>
277    <item>91</item>
278    <item>92</item>
279    <item>93</item>
280    <item>94</item>
281  </shahua>
282  <ret>succ</ret>
283</conf>

 

这里包含了开心花园里的所有信息,怎么样把这些信息读入呢, 好多人的想法都是把这个XML读到XMLDocument里,然后一个一个节点去查找所要的信息,其实用把这个XML反序化了,直接就可以得到一切我们所想要的,何乐而不为呢,我们根据这个XML设计我们的类,反序列化也不是每个节点都有要类中有相对的字段属性,选一些我们需要的就可以, 下面是我设计的类

 

ContractedBlock.gif ExpandedBlockStart.gif Code
  1[XmlRoot(ElementName = "conf")]
  2    public class GardenInfo
  3ExpandedBlockStart.gifContractedBlock.gif    {
  4        public Account account;
  5        [XmlArray(ElementName="garden")]
  6        [XmlArrayItem(ElementName="item")]
  7        public Garden[] garden;
  8
  9    }

 10
 11    public class Account
 12ExpandedBlockStart.gifContractedBlock.gif    {
 13ExpandedSubBlockStart.gifContractedSubBlock.gif        public int Uid getset; }
 14        public int rank;
 15        //public string ranktip;
 16        private string _ranktip;
 17ExpandedSubBlockStart.gifContractedSubBlock.gif        public string ranktip {
 18            get
 19ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 20                return _ranktip.Replace("\n"," ");
 21            }

 22            set
 23ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 24                _ranktip = value;
 25            }

 26        }

 27        public string cash;
 28        public string name;
 29        public string cashtip;
 30
 31    }

 32
 33    public class Garden
 34ExpandedBlockStart.gifContractedBlock.gif    {
 35        private string Pattern = @"<[^>]*>";
 36        Regex r;
 37        public Garden()
 38ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 39            r = new Regex(Pattern);
 40            _farm = " ";
 41            _crops = "";
 42        }

 43        public ActionState acs = ActionState.WAIT;
 44        public int water;
 45        public int farmnum;
 46        public int vermin;
 47        public double cropsid;
 48        public int fuid;
 49        public int status;
 50        public int grass;
 51        public int shared;
 52        public int cropsstatus;
 53        public int grow;
 54        public int totalgrow;
 55        public int fruitnum;
 56        public int seedid;
 57        public string name;
 58        //public string crops;
 59
 60        public string FarmArea 
 61ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 62            get
 63ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 64                if (this.shared == 0)
 65ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 66                    return string.Format("自留地 {0}"this.farmnum);
 67                }

 68                else
 69ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 70                    return string.Format("爱心地 {0}"this.farmnum);
 71                }

 72            }

 73        }

 74        private string _crops;
 75ExpandedSubBlockStart.gifContractedSubBlock.gif        public string crops {
 76            get
 77ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 78                if(_crops!=null)
 79                    _crops = this.r.Replace(_crops, " ");
 80                return _crops;
 81            }

 82            set
 83ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 84                _crops = value;
 85            }

 86        }

 87        //public string farm;
 88        private string _farm;
 89ExpandedSubBlockStart.gifContractedSubBlock.gif        public string farm {
 90            get
 91ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 92                _farm = this.r.Replace(_farm, " ");
 93                return _farm;
 94            }

 95            set
 96ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 97                _farm = value;
 98            }

 99        }

100    }

 

可以看到,我们的GardenInfo类,只有一个Account类型的包含花园所属帐户信息的字段,和一个包含花园中每一块田地信息的的Garden[] 数组字段。XML好多节点里的信息我们现在都用不到,所以不必要体现出来,如果以后的需要我们在对映的类里添加相关字段就可以了。

下面我们就写把这个类通过反序列化的方式来实例化的方法:

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 public GardenInfo GetGardenInfo(int uid)
 2         {
 3             string url = string.Format("http://www.kaixin001.com/!house/!garden//getconf.php?verify={0}&fuid={1}",this.g_verify,uid);
 4 
 5             //return this.Deserialize<GardenInfo>(url);
 6             //GardenInfo curGardenInfo = this.Deserialize<GardenInfo>(url);
 7             //请求服务器,并获得返回的XML字符串
 8             string str=this.myrequest.RequestByGet(url);
 9             
10             //把string类型的xml文件字符写入一个内存流以用于反序列化
11             byte[] bytes = Encoding.GetEncoding("UTF-8").GetBytes(str);
12             Stream s = new MemoryStream();
13             s.Write(bytes, 0, bytes.Length);
14             s.Position = 0;//这一行,相当重要,一开始,我反序列化老是莫明的失败,原因就在于缺这一句
15             XmlSerializer xmls = new XmlSerializer(typeof(GardenInfo));
16                         GardenInfo curGardenInfo = (GardenInfo)xmls.Deserialize(s);
17             return curGardenInfo;
18             
19         }

怎么样简单吧, 用你的VS试试吧。明天我们继续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值