zoukankan      html  css  js  c++  java
  • SharePreference是如何实现的——序列化XML文件

    还记得上一篇我们讲到了用SharePreference来存储数据,那么究竟它是如何实现的呢,今天我们就来仔细看看其实现的细节,我们给它一个准确的名字,叫做XML序列化器(XmlSerializer)。

    • 不同于上面一篇的保存用户的登录名以及密码,这次我们保存设备中的信息,但是由于现在知识有限,我还不能够实现对设备中信息的读取,那么我就在程序中自己生成若干条信息,对这些生成的信息进行读取,并保存到位于SD卡的backup.xml文件中。在这里我是用两种方法对其进行存储并比较两种方法的优缺点,当然作为开发,我更建议使用待会讲到的第二种方法。

     先来看看我们需要做到什么样的效果:

    图一


    • 第一种方法:使用StringBuffer,将所有的内容逐一追加到该字符流中。

     1 public void backUpSms1(View view){
     2         StringBuffer sb=new StringBuffer();
     3         sb.append("<?xml version="1.0" encoding="UTF-8" ?>");
     4         sb.append("<smss>");
     5         for (SmsInfo smsinfo: smsInfo) {
     6             sb.append("<sms>");
     7             sb.append("<address>");
     8             sb.append(smsinfo.getAddress());
     9             sb.append("</address>");
    10 
    11             sb.append("<date>");
    12             sb.append(smsinfo.getDate());
    13             sb.append("</date>");
    14 
    15             sb.append("<content>");
    16             sb.append(smsinfo.getContent());
    17             sb.append("</content>");
    18 
    19             sb.append("<type>");
    20             sb.append(smsinfo.getType());
    21             sb.append("</type>");
    22             sb.append("</sms>");
    23         }
    24         sb.append("</smss>");
    25         try {
    26             File file =new File(Environment.getExternalStorageDirectory(), "backUp1.xml");
    27             FileOutputStream fos =new FileOutputStream(file);
    28             fos.write(sb.toString().getBytes());
    29             fos.close();
    30             Toast.makeText( this, "备份成功",0).show();
    31         } catch (Exception e) {
    32             e.printStackTrace();
    33             Toast.makeText( this, "备份失败",0).show();
    34         }
    35     }

    第一种方法相当简单,只是用了一个字符流,将所有的内容逐一追加就行了,可是当我们的短信中出现了一些比较特殊的字符,例如:"<"或者是">"那么在读取并写入到xml文件的时候就会出错,这个时候打开该xml文件的时候将会报错;另外当我们需要在sms标签中加入一些属性,如图一所示,那么这个时候仅仅利用字符流来写就会变得冗杂,而且逻辑关系就不严谨了,所以这个时候我们就需要用到第二种方法了。

    • 第二种方法(推荐):XML序列化器(使用XmlSerializer编辑xml文件)

     1 public void backUpSms2(View view) {
     2         try {
     3             //初始化序列号器,指定xml写入到哪个文件并指定写入的编码格式
     4             XmlSerializer xmlSerializer =Xml.newSerializer();
     5             File file =new File(Environment.getExternalStorageDirectory(), "backUp2.xml");
     6             FileOutputStream fos=new FileOutputStream(file);
     7             xmlSerializer.setOutput(fos,"utf-8");
     8             
     9             xmlSerializer.startDocument("utf-8", true);//开始声明文件
    10             xmlSerializer.startTag(null, "smss");//开始最外层标签
    11             for (SmsInfo sms : smsInfo) {
    12                 xmlSerializer.startTag(null, "sms");//写入第一个标签
    13                 xmlSerializer.attribute(null, "id", sms.getId()+"");//第一个标签的属性
    14 
    15                 xmlSerializer.startTag(null, "address");//写入内一层的标签
    16                 xmlSerializer.text(sms.getAddress());
    17                 xmlSerializer.endTag(null, "address");
    18 
    19                 xmlSerializer.startTag(null, "date");//写入内一层的标签
    20                 xmlSerializer.text(sms.getDate()+"");
    21                 xmlSerializer.endTag(null, "date");
    22 
    23                 xmlSerializer.startTag(null, "content");//写入内一层的标签
    24                 xmlSerializer.text(sms.getContent());
    25                 xmlSerializer.endTag(null, "content");
    26 
    27                 xmlSerializer.startTag(null, "type");//写入内一层的标签
    28                 xmlSerializer.text(sms.getType()+"");
    29                 xmlSerializer.endTag(null, "type");
    30 
    31                 xmlSerializer.endTag(null, "sms");//结束标签
    32 
    33             }
    34             xmlSerializer.endTag(null, "smss");//结束最外层标签
    35             xmlSerializer.endDocument();//结束声明文件
    36             fos.close();//记得一定要关闭输出流
    37             Toast.makeText( this, "备份成功",0).show();
    38         } catch (Exception e) {
    39             e.printStackTrace();
    40             Toast.makeText( this, "备份失败",0).show();
    41         }
    42     }

    使用XmlSerializer的时候有几个步骤:1、首先需要找到输出流,即通过setOutput方法将输出流以及编码格式传入;2、接着需要声明文件以及结束声明,这是通过startDocument以及endDocument这两个方法来实现的;3、接着就可以通过startTag以及startTag方法来声明标签以及结束标签,要声明标签的内容的时候可以通过text方法,当然这个方法只能允许传入String类型,所以对于其他数据类型,需要先对其进行转换;4、最后一点就是上面讲到的——要在标签中添加属性,那就需要通过attribute方法声明id属性。

    通过以上的讲解,我们可以得到以下的xml文件:

      1 <?xml version="1.0" encoding="UTF-8" standalone="true"?>
      2 
      3 -<smss>
      4 
      5 
      6 -<sms id="0">
      7 
      8 <address>135000000000</address>
      9 
     10 <date>1461845202224</date>
     11 
     12 <content>内容为:0</content>
     13 
     14 <type>1</type>
     15 
     16 </sms>
     17 
     18 
     19 -<sms id="1">
     20 
     21 <address>135000000001</address>
     22 
     23 <date>1461845202225</date>
     24 
     25 <content>内容为:1</content>
     26 
     27 <type>2</type>
     28 
     29 </sms>
     30 
     31 
     32 -<sms id="2">
     33 
     34 <address>135000000002</address>
     35 
     36 <date>1461845202225</date>
     37 
     38 <content>内容为:2</content>
     39 
     40 <type>1</type>
     41 
     42 </sms>
     43 
     44 
     45 -<sms id="3">
     46 
     47 <address>135000000003</address>
     48 
     49 <date>1461845202225</date>
     50 
     51 <content>内容为:3</content>
     52 
     53 <type>2</type>
     54 
     55 </sms>
     56 
     57 
     58 -<sms id="4">
     59 
     60 <address>135000000004</address>
     61 
     62 <date>1461845202225</date>
     63 
     64 <content>内容为:4</content>
     65 
     66 <type>2</type>
     67 
     68 </sms>
     69 
     70 
     71 -<sms id="5">
     72 
     73 <address>135000000005</address>
     74 
     75 <date>1461845202225</date>
     76 
     77 <content>内容为:5</content>
     78 
     79 <type>2</type>
     80 
     81 </sms>
     82 
     83 
     84 -<sms id="6">
     85 
     86 <address>135000000006</address>
     87 
     88 <date>1461845202225</date>
     89 
     90 <content>内容为:6</content>
     91 
     92 <type>2</type>
     93 
     94 </sms>
     95 
     96 
     97 -<sms id="7">
     98 
     99 <address>135000000007</address>
    100 
    101 <date>1461845202225</date>
    102 
    103 <content>内容为:7</content>
    104 
    105 <type>2</type>
    106 
    107 </sms>
    108 
    109 
    110 -<sms id="8">
    111 
    112 <address>135000000008</address>
    113 
    114 <date>1461845202225</date>
    115 
    116 <content>内容为:8</content>
    117 
    118 <type>1</type>
    119 
    120 </sms>
    121 
    122 
    123 -<sms id="9">
    124 
    125 <address>135000000009</address>
    126 
    127 <date>1461845202225</date>
    128 
    129 <content>内容为:9</content>
    130 
    131 <type>2</type>
    132 
    133 </sms>
    134 
    135 
    136 -<sms id="10">
    137 
    138 <address>135000000010</address>
    139 
    140 <date>1461845202225</date>
    141 
    142 <content>内容为:10</content>
    143 
    144 <type>1</type>
    145 
    146 </sms>
    147 
    148 
    149 -<sms id="11">
    150 
    151 <address>135000000011</address>
    152 
    153 <date>1461845202225</date>
    154 
    155 <content>内容为:11</content>
    156 
    157 <type>2</type>
    158 
    159 </sms>
    160 
    161 
    162 -<sms id="12">
    163 
    164 <address>135000000012</address>
    165 
    166 <date>1461845202225</date>
    167 
    168 <content>内容为:12</content>
    169 
    170 <type>2</type>
    171 
    172 </sms>
    173 
    174 
    175 -<sms id="13">
    176 
    177 <address>135000000013</address>
    178 
    179 <date>1461845202225</date>
    180 
    181 <content>内容为:13</content>
    182 
    183 <type>2</type>
    184 
    185 </sms>
    186 
    187 
    188 -<sms id="14">
    189 
    190 <address>135000000014</address>
    191 
    192 <date>1461845202225</date>
    193 
    194 <content>内容为:14</content>
    195 
    196 <type>2</type>
    197 
    198 </sms>
    199 
    200 
    201 -<sms id="15">
    202 
    203 <address>135000000015</address>
    204 
    205 <date>1461845202225</date>
    206 
    207 <content>内容为:15</content>
    208 
    209 <type>1</type>
    210 
    211 </sms>
    212 
    213 
    214 -<sms id="16">
    215 
    216 <address>135000000016</address>
    217 
    218 <date>1461845202225</date>
    219 
    220 <content>内容为:16</content>
    221 
    222 <type>1</type>
    223 
    224 </sms>
    225 
    226 
    227 -<sms id="17">
    228 
    229 <address>135000000017</address>
    230 
    231 <date>1461845202225</date>
    232 
    233 <content>内容为:17</content>
    234 
    235 <type>1</type>
    236 
    237 </sms>
    238 
    239 
    240 -<sms id="18">
    241 
    242 <address>135000000018</address>
    243 
    244 <date>1461845202225</date>
    245 
    246 <content>内容为:18</content>
    247 
    248 <type>2</type>
    249 
    250 </sms>
    251 
    252 
    253 -<sms id="19">
    254 
    255 <address>135000000019</address>
    256 
    257 <date>1461845202225</date>
    258 
    259 <content>内容为:19</content>
    260 
    261 <type>1</type>
    262 
    263 </sms>
    264 
    265 </smss>

    2016-04-29

    BOB

    --开始忙碌的五一

     

  • 相关阅读:
    (转)大型网站架构演化发展历程
    Android编译错误, Ignoring InnerClasses attribute for an anonymous inner class
    (转)写让别人能读懂的代码
    JVectorMap地图插件.Net版开源
    (转)淘宝技术发展
    (转)史上最全的MSSQL复习笔记
    (转)jieba中文分词的.NET版本:jieba.NET
    (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)
    (转)分布式中使用Redis实现Session共享(二)
    (转)分布式中使用Redis实现Session共享(一)
  • 原文地址:https://www.cnblogs.com/ghylzwsb/p/5447810.html
Copyright © 2011-2022 走看看