Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用開發入門(四十九)將對象序列化為XML格式

Android應用開發入門(四十九)將對象序列化為XML格式

編輯:Android開發實例

前言

  之前有講過在Android下如何解析XML文件的內容,這篇博客講講如何把一個對象序列化為XML格式,有時候一些項目中需要傳遞一些XML格式的數據。而對於如何解析XML,不了解的朋友可以看看其他三篇:http://www.fengfly.com/plus/view-213372-1.html、http://www.fengfly.com/plus/view-213373-1.html、http://www.fengfly.com/plus/view-213374-1.html。

 

什麼是XML?

  首先我們先了解一下什麼是XML。XML,可擴展標記語言 (Extensible Markup Language) ,用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言,這是百度百科的解釋。而XML是一種在Internet中傳輸數據的常見格式,它與HTML一樣,都是SGML(標准通用標記語言),無論你是需要通過Internet訪問數據,或者發送數據給Web服務,都可能需要用到XML的知識。恰恰Android應用程序需要和網絡交互,否則只是一款單機的無互動的應用程序,所以很可能在Android應用程序開發的過程中使用到XML。

  由於XML的擴展性強,致使它需要有穩定的基礎規則來支持擴展,該語法規則需要注意的是:

  1. 開始和結束標簽匹配。
  2. 嵌套標簽不能相互嵌套。
  3. 區分大小寫。

 

XML序列化

  當獲取到一段數據後,如果需要把它序列化成XML的格式,通常有兩種辦法:

  1. 拼接字符串的形式序列化一個XML數據。
  2. 使用XmlSerializer類序列化一個XML數據。

  使用拼接字符串的方式很簡單,就是個體力活,把需要序列化的對象,依照一定的格式序列化即可。下面通過一個示例講解來演示如何拼接字符串,在示例中模擬聯系人數據,然後對其進行序列化成XML,最後保存在SD卡上。

  1. private void backupToContact1(){  
  2.         StringBuilder sbuilder=new StringBuilder();  
  3.         // 設置XML的數據頭  
  4.         sbuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");  
  5.         sbuilder.append("<contacts>");  
  6.         // 遍歷聯系人信息  
  7.         for(Contact contact:Contacts){  
  8.             if(contact!=null){  
  9.                 sbuilder.append("<contact id='"+contact.getId()+"'>");  
  10.                 sbuilder.append("<name>");  
  11.                 sbuilder.append(contact.getName());  
  12.                 sbuilder.append("</name>");  
  13.                   
  14.                 sbuilder.append("<number>");  
  15.                 sbuilder.append(contact.getNumber());  
  16.                 sbuilder.append("</number>");  
  17.                   
  18.                 sbuilder.append("<address>");  
  19.                 sbuilder.append(contact.getAddress());  
  20.                 sbuilder.append("</address>");  
  21.                   
  22.                 sbuilder.append("</contact>");  
  23.             }  
  24.         }              
  25.         sbuilder.append("</contacts>");  
  26.         try {  
  27.             // 在SD卡上創建一個xml文件  
  28.             File file=new File(Environment.getExternalStorageDirectory(),"backup1.xml");  
  29.             FileOutputStream fos=new FileOutputStream(file);  
  30.             // 把序列化的數據寫入到XML文件中  
  31.             fos.write(sbuilder.toString().getBytes());  
  32.             fos.close();  
  33.             Toast.makeText(MainActivity.this, "備份成功", 0).show();  
  34.         } catch (IOException e) {  
  35.             Toast.makeText(MainActivity.this, "備份失敗", 0).show();  
  36.             e.printStackTrace();  
  37.         }  
  38.     } 

 

  執行完之後,可以把SD卡上的XML文件導出到電腦上,查看其內容。

  對於拼接字符串而言,可以看出,很容易出錯,尤其是每個標簽內如果還存在屬性值就更需要細心了。而且如果其內容存在特殊的符號,如“<、>”等,就會導致XML序列化後的XML文件出錯,而使用XmlSerializer來序列化XML文件就不存在這些問題。

  下面介紹第二種方式,通過XmlSerializer類來序列化XML。那先了解一下XmlSerializer,XmlSerializer主要是是以數據流的形式序列化XML,而它是一個接口類型,無法直接實例化,需要通過一個靜態方法Xml.newSerializer()獲取對象。

  以下是一些常用方法:

  • setOutput(OutputStream,String):設置輸出流,以及編碼格式。
  • startDocument(String,boolean):第一個參數設置文檔的編碼格式,第二個參數設置是否是一個獨立的文檔,一般設置為true。
  • endDocument():標記XML文檔的結束,XML文檔標簽均為成對出現,有始有終。
  • startTag(String,String):一個XML標簽的開始,第一個參數為命名空間,一般為null即可,第二個參數為標簽名。
  • endTag(String,String):一個XML標簽的結束,第一個參數為命名空間,一般為null即可,第二個參數為標簽名,有始有終。
  • attribute(String,String,String):設置一個標簽的屬性,第一個參數為命名空間,第二個參數是屬性名,第三個參數為屬性值。

  上面已經介紹過了XmlSerializer的常用方法,下面通過一個示例來演示XmlSerializer的使用。在示例中實現的功能和上面拼接字符串序列化XML一致,都是序列化模擬的聯系人信息,然後以XML的格式保存在SD卡上。

  1. private void backupToContact2(){  
  2.         try {  
  3.             // 在SD卡上創建一個文件  
  4.             File file=new File(Environment.getExternalStorageDirectory(),"backup2.xml");  
  5.             FileOutputStream fos=new FileOutputStream(file);  
  6.             // 獲取一個XmlSerializer  
  7.             XmlSerializer serializer = Xml.newSerializer();  
  8.             // 設置XML的輸出流以及編碼格式  
  9.             serializer.setOutput(fos,"utf-8");  
  10.             // 設置文檔的開頭,以及編碼格式  
  11.             serializer.startDocument("utf-8", true);  
  12.               
  13.             // 開始標簽  
  14.             serializer.startTag(null, "contacts");  
  15.             for(Contact contact:Contacts){  
  16.                 serializer.startTag(null, "contact");  
  17.                 // 設置contact標簽的id屬性  
  18.                 serializer.attribute(null, "id", contact.getId()+"");  
  19.                 serializer.startTag(null, "name");  
  20.                 serializer.text(contact.getName());  
  21.                 serializer.endTag(null, "name");  
  22.                   
  23.                 serializer.startTag(null, "number");  
  24.                 serializer.text(contact.getNumber());  
  25.                 serializer.endTag(null, "number");  
  26.                   
  27.                 serializer.startTag(null, "address");  
  28.                 serializer.text(contact.getAddress());  
  29.                 serializer.endTag(null, "address");  
  30.                 serializer.endTag(null, "contact");  
  31.             }  
  32.             // 一個結束標簽  
  33.             serializer.endTag(null, "contacts");  
  34.             // 標記文檔的結束  
  35.             serializer.endDocument();  
  36.             // 關閉輸出流  
  37.             fos.close();  
  38.             Toast.makeText(MainActivity.this, "備份成功", 0).show();  
  39.         } catch (Exception e) {  
  40.             e.printStackTrace();  
  41.             Toast.makeText(MainActivity.this, "備份失敗", 0).show();  
  42.         }          
  43.     } 

  保存成功之後,可以通過File Explorer導出XML文件查看其內容,上面兩個示例序列化的XML文件一致,如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <contacts> 
  3. <contact id="0"> 
  4. <name>Damon0</name> 
  5. <number>18600000000</number> 
  6. <address>beijing0</address> 
  7. </contact> 
  8. <contact id="1"> 
  9. <name>Damon1</name> 
  10. <number>18600000001</number> 
  11. <address>beijing1</address> 
  12. </contact> 
  13. <contact id="2"> 
  14. <name>Damon2</name> 
  15. <number>18600000002</number> 
  16. <address>beijing2</address> 
  17. </contact> 
  18. <contact id="3"> 
  19. <name>Damon3</name> 
  20. <number>18600000003</number> 
  21. <address>beijing3</address> 
  22. </contact> 
  23. <contact id="4"> 
  24. <name>Damon4</name> 
  25. <number>18600000004</number> 
  26. <address>beijing4</address> 
  27. </contact> 
  28. <contact id="5"> 
  29. <name>Damon5</name> 
  30. <number>18600000005</number> 
  31. <address>beijing5</address> 
  32. </contact> 
  33. <contact id="6"> 
  34. <name>Damon6</name> 
  35. <number>18600000006</number> 
  36. <address>beijing6</address> 
  37. </contact> 
  38. <contact id="7"> 
  39. <name>Damon7</name> 
  40. <number>18600000007</number> 
  41. <address>beijing7</address> 
  42. </contact> 
  43. <contact id="8"> 
  44. <name>Damon8</name> 
  45. <number>18600000008</number> 
  46. <address>beijing8</address> 
  47. </contact> 
  48. <contact id="9"> 
  49. <name>Damon9</name> 
  50. <number>18600000009</number> 
  51. <address>beijing9</address> 
  52. </contact> 
  53. </contacts> 

 

  在示例中,訪問了SD卡,所以需要在清單文件中加入SD卡寫入權限:

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

  源碼下載

 

總結

  因為拼接字符串的方式比較不直觀,容易出錯,量大了需要很細心才行,基本上是個體力活,而且如果內容存在對於一些對於XML格式數據有特殊意義的符號,會導致拼接後的XML數據無法正常被解析。一般情況下,推薦使用XmlSerializer來序列化XML數據,使用XmlSerializer來序列化XML不存在這方面的問題,對於一些特殊符號,它會自動對其進行轉義。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved