100165652.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 352 行 · 第 1/5 页
HTM
352 行
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">参见</span><span lang="EN-US">Framework</span><span style="FONT-FAMILY: 宋体">文档说明书,了解</span><span lang="EN-US">xsd.exe</span><span style="FONT-FAMILY: 宋体">命令行选项的详细内容。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">尽管</span><span lang="EN-US">xsd.exe</span><span style="FONT-FAMILY: 宋体">具备这些功能,但不一定用它为串行化创建类。这个过程是很简单的。下面介绍一个简单的应用程序,它串行化一个类,读取在本章前面保存的产品数据。该代码在</span><span lang="EN-US">SerialSample1</span><span style="FONT-FAMILY: 宋体">文件夹中。示例代码的起始部分比较简单,创建一个新的</span><span lang="EN-US">Product</span><span style="FONT-FAMILY: 宋体">对象</span><span lang="EN-US">pd</span><span style="FONT-FAMILY: 宋体">,并给它填充一些数据:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">private void button1</span><span lang="EN-US" style="FONT-FAMILY: 'Baskerville BE Regular'">_</span><span lang="EN-US">Click(object sender, System.EventArgs e)</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //new products object</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Products pd=new Products();</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //set some properties</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.ProductID=200;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.CategoryID=100;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.Discontinued=false;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.ProductFTEL="Serialize Objects";</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.QuantityPerUnit="6";</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.ReorderLevel=1;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.SupplierID=1;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.UnitPrice=1000;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pd.UnitsInStock=10;</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> pd.UnitsOnOrder=0;</span></p>
<p class="MsoNormal"><span lang="EN-US">XmlSerializer</span><span style="FONT-FAMILY: 宋体">类的</span><span lang="EN-US">Serialize</span><span style="FONT-FAMILY: 宋体">方法实际执行串行化,它有</span><span lang="EN-US">6</span><span style="FONT-FAMILY: 宋体">个重载方法。第一个重载方法的参数是要写入数据的流,可以是</span><span lang="EN-US">Stream</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">TextWriter</span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">XmlWriter</span><span style="FONT-FAMILY: 宋体">。在本例中,创建了一个基于</span><span lang="EN-US">TextWriter</span><span style="FONT-FAMILY: 宋体">的对象</span><span lang="EN-US">tr</span><span style="FONT-FAMILY: 宋体">。接着创建了基于</span><span lang="EN-US">XmlSerializer</span><span style="FONT-FAMILY: 宋体">的对象</span><span lang="EN-US">sr</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">XmlSerializer</span><span style="FONT-FAMILY: 宋体">需要知道要串行化的对象的类型信息,所以对要串行化的类型使用</span><span lang="EN-US">typeof</span><span style="FONT-FAMILY: 宋体">关键字。在创建</span><span lang="EN-US">sr</span><span style="FONT-FAMILY: 宋体">对象后,调用</span><span lang="EN-US">Serialize</span><span style="FONT-FAMILY: 宋体">方法,其参数是</span><span lang="EN-US">tr(</span><span style="FONT-FAMILY: 宋体">基于</span><span lang="EN-US">Stream</span><span style="FONT-FAMILY: 宋体">的对象</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">和要串行化的对象,在本例中是</span><span lang="EN-US">pd</span><span style="FONT-FAMILY: 宋体">。确保完成后关闭该数据流。</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> //new TextWriter and XmlSerializer</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> TextWriter tr=new StreamWriter("..\\..\\..\\serialprod.xml");</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XmlSerializer sr=new XmlSerializer(typeof(Products));</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //serialize object</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> sr.Serialize(tr,pd);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> tr.Close();</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">下面介绍</span><span lang="EN-US">Products</span><span style="FONT-FAMILY: 宋体">类,即要串行化的类。这个类与以前编写的其他类的惟一区别是给它增加了</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">属性。这些属性中的</span><span lang="EN-US">XmlRootAttribute </span><span style="FONT-FAMILY: 宋体">和</span> <span lang="EN-US">XmlElementAttribute</span><span style="FONT-FAMILY: 宋体">类由</span><span lang="EN-US">System.Attribute</span><span style="FONT-FAMILY: 宋体">类继承而来。不要把这些属性与</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档中的属性相混淆。</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">属性仅是一些声明信息,在运行期间可以由</span><span lang="EN-US">CLR</span><span style="FONT-FAMILY: 宋体">获取</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">详见第</span><span lang="EN-US">6</span><span style="FONT-FAMILY: 宋体">章</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。在本例中,添加一些描述如何串行化对象的属性:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">//class that will be serialized.</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">//attributes determine how object is serialized</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">public class Products </span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public int ProductID;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public string ProductName;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public int SupplierID;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public int CategoryID;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public string QuantityPerUnit;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public System.Decimal UnitPrice;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public short UnitsInStock;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public short UnitsOnOrder;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public short ReorderLevel;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public bool Discontinued;</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">Products</span><span style="FONT-FAMILY: 宋体">类定义前面的属性中调用的</span><span lang="EN-US">XmlRootAttribute()</span><span style="FONT-FAMILY: 宋体">把这个类标识为根元素</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文件中,由串行化生成的</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。包含</span><span lang="EN-US">XmlElementAttribute()</span><span style="FONT-FAMILY: 宋体">的属性把该属性下面的成员看做为表示一个</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">元素。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">查看一下刚才在串行化过程中创建的</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档,就会发现它与前面创建的其他</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档非常类似。这就是本练习的目的。下面就是这个文档:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"><?xml version="1.0" encoding="utf-8"?></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"><Products xmlns:xsd="http://www.w3.org/2001/XMLSchema" </span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <ProductID>200</ProductID></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <ProductName>Serialize Objects</ProductName></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <SupplierID>1</SupplierID></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <CategoryID>100</CategoryID></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <QuantityPerUnit>6</QuantityPerUnit></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <UnitPrice>1000</UnitPrice></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <UnitsInStock>10</UnitsInStock></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <UnitsOnOrder>0</UnitsOnOrder></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <ReorderLevel>1</ReorderLevel></span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <Discontinued>false</Discontinued></span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"></Products> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这里没有任何不寻常的地方。可以以</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档的任何方式来使用这个文档。可以对它进行转换,以</span><span lang="EN-US">HTML</span><span style="FONT-FAMILY: 宋体">格式显示它,使用</span><span lang="EN-US">ADO.NET</span><span style="FONT-FAMILY: 宋体">将其加载到</span><span lang="EN-US">DataSet</span><span style="FONT-FAMILY: 宋体">中,用它加载</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">,或者像在该示例中那样,对它进行反串行化,创建一个对象,该对象的状态与串行化前</span><span lang="EN-US">pd</span><span style="FONT-FAMILY: 宋体">的状态一样</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">这就是第二个按钮的作用</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">接着添加另一个按钮事件处理程序,反串行化一个基于</span><span lang="EN-US">Products</span><span style="FONT-FAMILY: 宋体">的新对象</span><span lang="EN-US">newPd</span><span style="FONT-FAMILY: 宋体">。这次使用</span><span lang="EN-US">FileStream</span><span style="FONT-FAMILY: 宋体">对象读取</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">private void button2</span><span lang="EN-US" style="FONT-FAMILY: 'Baskerville BE Regular'">_</span><span lang="EN-US">Click(object sender, System.EventArgs e)</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?