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">&nbsp;&nbsp; //new products object</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; Products pd=new Products();</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; //set some properties</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; pd.ProductID=200;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; pd.CategoryID=100;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; pd.Discontinued=false;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; pd.ProductFTEL=&quot;Serialize Objects&quot;;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; pd.QuantityPerUnit=&quot;6&quot;;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; pd.ReorderLevel=1;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; pd.SupplierID=1;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; pd.UnitPrice=1000;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; 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">&nbsp;&nbsp; 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">&nbsp;&nbsp; //new TextWriter and XmlSerializer</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; TextWriter tr=new StreamWriter(&quot;..\\..\\..\\serialprod.xml&quot;);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; 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">&nbsp;&nbsp; //serialize object</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; sr.Serialize(tr,pd);</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; 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=&quot;&quot;, 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">&nbsp;&nbsp; [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">&nbsp;&nbsp; public int ProductID;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [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">&nbsp;&nbsp; public string ProductName;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; public int SupplierID;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; public int CategoryID;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; public string QuantityPerUnit;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; public System.Decimal UnitPrice;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; public short UnitsInStock;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; public short UnitsOnOrder;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; public short ReorderLevel;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; [System.Xml.Serialization.XmlElementAttribute()]</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; 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">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&lt;Products xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; </span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;ProductID&gt;200&lt;/ProductID&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;ProductName&gt;Serialize Objects&lt;/ProductName&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;SupplierID&gt;1&lt;/SupplierID&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;CategoryID&gt;100&lt;/CategoryID&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;QuantityPerUnit&gt;6&lt;/QuantityPerUnit&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;UnitPrice&gt;1000&lt;/UnitPrice&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;UnitsInStock&gt;10&lt;/UnitsInStock&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;UnitsOnOrder&gt;0&lt;/UnitsOnOrder&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;ReorderLevel&gt;1&lt;/ReorderLevel&gt;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; &lt;Discontinued&gt;false&lt;/Discontinued&gt;</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">&lt;/Products&gt; </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 + -
显示快捷键?