Android xml文件序列化,Android学习笔记之—XML文件的序列化

以文件的方式在sd卡或者内存存储信息,这个方法不是特别方便,android提供了一个面向对象的方式,以xml文件存储,即序列化。

把所有要存储的信息以xml文件的格式存储,这个不仅可以避免用户信息中存在非标准字符引起的错误,而且更加简洁明了。

本文我们会构造大量短信,并且以xml的形式存储这些短信信息。本文提供实现了两种方式存储为xml文件,一种是认为创造一个xml文件,并且按照xml文件的格式填写信息。另外一种就是android标准的借口。

package com.hm.xmlserialize;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.io.Writer;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import org.xmlpull.v1.XmlSerializer;

import com.hm.xmlserialize.SmsInfo.SmsInfo;

import android.os.Bundle;

import android.os.Environment;

import android.app.Activity;

import android.util.Xml;

import android.view.Menu;

import android.view.View;

import android.widget.Toast;

public class MainActivity extends Activity {

private List smsInfos;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Random random = new Random();

smsInfos = new ArrayList(); //构造10条短信信息,包括时间、发送/接收、短信内容、电话号码等

long number = 1350000000;

for(int i = 0;i < 10;i++) {

smsInfos.add(new SmsInfo(i,System.currentTimeMillis(),random.nextInt(2),"短信内容

}

}

/**

* xml序列化

* @param view

*/

public void backup2(View view){

XmlSerializer xmlSerializer = Xml.newSerializer();

try {

File file = new File(Environment.getExternalStorageDirectory(),"backup2.xml");

FileOutputStream fos = new FileOutputStream(file);

//初始化序列器,指定xml文件写到哪个文件,以什么编码格式

xmlSerializer.setOutput(fos, "utf-8");

xmlSerializer.startDocument("utf-8", true);

xmlSerializer.startTag(null, "smss");

for(SmsInfo info:smsInfos){

xmlSerializer.startTag(null, "sms");

xmlSerializer.attribute(null, "id", info.getId()+"");

xmlSerializer.startTag(null, "data");

xmlSerializer.text(info.getData()+"");

xmlSerializer.endTag(null,"data");

xmlSerializer.startTag(null, "address");

xmlSerializer.text(info.getAddress());

xmlSerializer.endTag(null,"address");

xmlSerializer.startTag(null, "body");

xmlSerializer.text(info.getBody());

xmlSerializer.endTag(null,"body");

xmlSerializer.startTag(null, "type");

xmlSerializer.text(info.getType()+"");

xmlSerializer.endTag(null,"type");

xmlSerializer.endTag(null,"sms");

}

xmlSerializer.endTag(null, "smss");

xmlSerializer.endDocument();

fos.close();

Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();

}

}

/**

* 备份短信

* @param view

*/

public void backup(View view){

StringBuilder sb = new StringBuilder();

sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

sb.append("");

for(SmsInfo info:smsInfos){

sb.append("");

sb.append("

");

sb.append(info.getAddress());

sb.append("

");

sb.append("");

sb.append(info.getType());

sb.append("");

sb.append("

");

sb.append(info.getBody());

sb.append("");

sb.append("");

sb.append(info.getData());

sb.append("");

sb.append("");

}

sb.append("");

File file = new File(Environment.getExternalStorageDirectory(),"backup.xml");

try {

FileOutputStream fos = new FileOutputStream(file);

fos.write(sb.toString().getBytes());

fos.close();

Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();

}

}

}

上面backup方法是认为构造一个xml文件,按照xml文件的格式填写了标签及信息。backup2按照标准的借口填写需要保存的信息。

XmlSerializer xmlSerializer = Xml.newSerializer();获得一个xml序列化器。

xmlSerializer.setOutput(fos, "utf-8");设置序列化器的输出流及编码格式

xmlSerializer.startDocument("utf-8", true);xml文件的Document信息

xml文件的标签作为Tag在这里表示,有startTag就有endTag,在startTag和endTag之间设置信息即可。

短信的信息代码如下:

package com.hm.xmlserialize.SmsInfo;

public class SmsInfo {

private int id;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

private long data;

private String body;

private int type;

private String address;

public SmsInfo(){

}

public SmsInfo(int id,long data, int type, String body, String address) {

super();

this.data = data;

this.body = body;

this.type = type;

this.address = address;

this.id = id;

}

public long getData() {

return data;

}

public void setData(long data) {

this.data = data;

}

public String getBody() {

return body;

}

public void setBody(String body) {

this.body = body;

}

public int getType() {

return type;

}

public void setType(int type) {

this.type = type;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

整个app的布局文件如下:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity" >

android:id="@+id/bt_save"

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:layout_centerInParent="true"

android:onClick="backup"

android:text="@string/save"/>

android:id="@+id/bt_save2"

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:layout_centerInParent="true"

android:layout_below="@id/bt_save"

android:onClick="backup2"

android:text="@string/save2"/>

布局采用相对布局,定义了两个按键,分别对应两种存储方式。

当然保存信息到sd卡要添加些sd卡权限,在AndroidManifest.xml文件中添加下面一句话即可: