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<SmsInfo> smsInfos;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Random random = new Random();
        smsInfos = new ArrayList<SmsInfo>(); //构造10条短信信息,包括时间、发送/接收、短信内容、电话号码等
		long  number = 1350000000;
        for(int i = 0;i < 10;i++) {
        	smsInfos.add(new SmsInfo(i,System.currentTimeMillis(),random.nextInt(2),"短信内容<"+i, Long.toString(number+i)));
        }
    }
    /**
     * 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("<smss>");
    	for(SmsInfo info:smsInfos){
    		sb.append("<sms>");
    		sb.append("<address>");
    		sb.append(info.getAddress());
    		sb.append("</address>");
    		
    		sb.append("<type>");
    		sb.append(info.getType());
    		sb.append("</type>");
    		
    		sb.append("<body>");
    		sb.append(info.getBody());
    		sb.append("</body>");
    		
    		sb.append("<date>");
    		sb.append(info.getData());
    		sb.append("</date>");
    		sb.append("</sms>");
    	}
    	sb.append("</smss>");
    	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的布局文件如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

	<Button 
	    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"/>
	<Button 
	    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"/>

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

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

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





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值