开心网外挂开发之 XML序列化于反序列化
通过昨天的文章我们已经了解了开发一个开心网的外挂所需要的最基本的东本,接下来的工作可以说基本上就上围绕这个基础来进行的,我写这一系列文章主要的目地不仅仅是为了让大家了解怎么开发开心网外挂,最主要的目过还是通过一个实例程序的编程,让初学者了解C#。
因为好多初学都看了很多基础性的东西,了解到了C#有好多特性, 但这些特性到底是干吗用的,或用了有什么好处了解的不够清楚,所以我在这一系列中,会陆续介绍
- XML序列化
- 泛型
- 设计模式的运用
- 多线程
等等这些都将会在我的程序中被运用到,今天先写XML序列化与反序列化,其实我的程序主要用到的是XML的反序列化,我们先了解一下XML序列化与反序列化是怎么回事
XML序列化与反序列化
MSDN中是这么说的:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。
在C#中XML 序列化中的中心类是 XmlSerializer 类,该类中最重要的方法是 Serialize 和 Deserialize 方法。简单的示例我就不从MSDN中抄了, 大家了解了就行, 不了解去翻MSDN。下面我会到我们的程序, 为什么我们要用到序列化。
为什么我们需要XML序列化
我们先对开心网的各种操作进行分析,我把我会发现,开心网好多操作请求服务器后,服务器会返会一个XML格式的字符串。比如说,我们的花园信息,我们会发现,服务器端返回的是这么一个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%<br><font size='12' color='#666666'>再过1天2小时更大一些</font><br>距离收获:7天18小时<br></crops>80
<farm>水:<br>第30季<br></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%<br><font size='12' color='#666666'>再过1天2小时更大一些</font><br>距离收获:7天18小时<br></crops>102
<farm>水:<br>第34季<br></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%<br><font size='12' color='#666666'>再过2小时43分再高一些</font><br>距离收获:2天2小时43分<br></crops>154
<farm>水:<br>第20季<br></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<br>剩余:4<br><font size='12' color='#666666'>再过4天23小时44分枯死</font><br></crops>186
<farm>水:<br>第19季<br></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<br>剩余:6<br><font size='12' color='#666666'>再过3天23小时44分枯死</font><br></crops>218
<farm>水:<br>第8季<br></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%<br><font size='12' color='#666666'>再过4小时11分长高一些</font><br>距离收获:1天12小时11分<br></crops>240
<farm>水:<br>第8季<br></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设计我们的类,反序列化也不是每个节点都有要类中有相对的字段属性,选一些我们需要的就可以, 下面是我设计的类
1
[XmlRoot(ElementName = "conf")]2
public class GardenInfo3

{4
public Account account;5
[XmlArray(ElementName="garden")]6
[XmlArrayItem(ElementName="item")]7
public Garden[] garden;8

9
}10

11
public class Account12

{13

public int Uid
{ get; set; }14
public int rank;15
//public string ranktip;16
private string _ranktip;17

public string ranktip
{18
get19

{20
return _ranktip.Replace("\n"," ");21
}22
set23

{24
_ranktip = value;25
}26
}27
public string cash;28
public string name;29
public string cashtip;30

31
}32

33
public class Garden34

{35
private string Pattern = @"<[^>]*>";36
Regex r;37
public Garden()38

{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 61

{62
get63

{64
if (this.shared == 0)65

{66
return string.Format("自留地 {0}", this.farmnum);67
}68
else69

{70
return string.Format("爱心地 {0}", this.farmnum);71
}72
}73
}74
private string _crops;75

public string crops
{76
get77

{78
if(_crops!=null)79
_crops = this.r.Replace(_crops, " ");80
return _crops;81
}82
set83

{84
_crops = value;85
}86
}87
//public string farm;88
private string _farm;89

public string farm
{90
get91

{92
_farm = this.r.Replace(_farm, " ");93
return _farm;94
}95
set96

{97
_farm = value;98
}99
}100
}
可以看到,我们的GardenInfo类,只有一个Account类型的包含花园所属帐户信息的字段,和一个包含花园中每一块田地信息的的Garden[] 数组字段。XML好多节点里的信息我们现在都用不到,所以不必要体现出来,如果以后的需要我们在对映的类里添加相关字段就可以了。
下面我们就写把这个类通过反序列化的方式来实例化的方法:
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试试吧。明天我们继续


浙公网安备 33010602011771号