package com.example.xmloperation;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer; import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; import com.example.bean.SmsInfo; public class MainActivity extends ActionBarActivity { private TextView content; private List<SmsInfo> smsInfos = new ArrayList<SmsInfo>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); content = (TextView)findViewById(R.id.tv); //将对象进行序列话
//1: 我们可以采用模拟的方法, 利用StringBuilder进行拼装XMl文件, 不过该方法不够灵活, 处理起来比较麻烦,但是工具底层的实现基本也是实现的。
} //2: 利用Android提供的Xml.Serializer 来进行序列化对象文XML
@SuppressLint("ShowToast")
public void serializer2XML(View view) {
//初始化短信
init(); Log.i("MainActivity", " 开始序列化");
XmlSerializer serializer = Xml.newSerializer();
File file = new File(Environment.getExternalStorageDirectory(), "smsinfo.xml");
FileOutputStream os;
try {
os = new FileOutputStream(file);
serializer.setOutput(os, "utf-8"); serializer.startDocument("utf-8", true);
serializer.startTag(null, "smss");
for (SmsInfo info : smsInfos) {
serializer.startTag(null, "sms");
serializer.attribute(null, "id", info.getId()+""); serializer.startTag(null, "body");
serializer.text(info.getBody());
serializer.endTag(null, "body"); serializer.startTag(null, "type");
serializer.text(info.getType()+"");
serializer.endTag(null, "type"); serializer.startTag(null, "date");
serializer.text(info.getDate()+"");
serializer.endTag(null, "date"); serializer.startTag(null, "address");
serializer.text(info.getAddress());
serializer.endTag(null, "address"); serializer.endTag(null, "sms");
}
serializer.endTag(null, "smss");
serializer.endDocument(); os.close(); Toast.makeText(this, "序列化成功", ).show(); } catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "序列化失败", ).show();
}
} //利用Pull解析XMl
public void deserialize(View view) { Log.i("MainActivity", " 开始反序列化"); XmlPullParser parser = Xml.newPullParser();
List<SmsInfo> mInfos = null;
SmsInfo info = null; try {
parser.setInput(MainActivity.class.getClassLoader().getResourceAsStream("smsinfo.xml"), "utf-8"); int type = parser.getEventType(); while (type != XmlPullParser.END_DOCUMENT) {
System.out.println("type = " + type);
switch (type) {
case XmlPullParser.START_TAG:
if ("smss".equals(parser.getName())) {
mInfos = new ArrayList<SmsInfo>();
} else if ("sms".equals(parser.getName())) {
info = new SmsInfo();
info.setId(Integer.parseInt(parser.getAttributeValue()));
} else if ("body".equals(parser.getName())) {
info.setBody(parser.nextText());
} else if ("type".equals(parser.getName())) {
String temp = parser.nextText();
//System.out.println("temp = " + temp);
info.setType(Integer.parseInt(temp));
} else if ("date".equals(parser.getName())){
info.setDate(Long.parseLong(parser.nextText()));
} else if ("address".equals(parser.getName())) {
info.setAddress(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if ("sms".equals(parser.getName())) {
mInfos.add(info);
info = null;
}
break;
}
type = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "反序列化失败", ).show(); ;
} StringBuilder sb = new StringBuilder();
System.out.println(mInfos.size());
for (SmsInfo info1 : mInfos) {
//System.out.println("info = " + info.getAddress());
sb.append(info1.toString() + "\n");
}
content.setText(sb.toString()); } private void init() {
Random random = new Random();
long address = 18766960000l;
for (int i = ; i < ; ++i) {
System.out.println("i = " + i);
SmsInfo smsInfo = new SmsInfo(System.currentTimeMillis(), random.nextInt() + , "短信内容" + i, ""+address + i, i);
smsInfos.add(smsInfo);
}
}
}

中间遇的坑爹的是在反序列化的时候你的xml中间每个元素之间不要出现空格,空文本, 否则指针指向的下一个就是空文本了, 解析会出现错误。

Android中序列化对象到XMl 和 XML反序列化为对象的更多相关文章

  1. Java序列化对象为字符串并将字符串反序列化为对象

    对象的序列化与反序列化其实就是将对象的状态保存下来,一般是保存到文件中,但是其实更常用的是将对象序列化为字符串保存到数据库中,然后在需要读取对象的情况下将字符串反序列化为对象.   可以序列化的类必须 ...

  2. spring mvc接收ajax提交的JSON数据,并反序列化为对象

    需求:spring mvc接收ajax提交的JSON数据,并反序列化为对象,代码如下: 前台JS代码: //属性要与带转化的对象属性对应 var param={name:'语文',price:16}; ...

  3. JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

    JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对 ...

  4. JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象 。

    JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对 ...

  5. 序列化工具类({对实体Bean进行序列化操作.},{将字节数组反序列化为实体Bean.})

    package com.dsj.gdbd.utils.serialize; import java.io.ByteArrayInputStream; import java.io.ByteArrayO ...

  6. C#和java和android中的NetWorkAdapter,httpRequest,WebView,json,xml

    原文地址:http://blog.csdn.net/intbird C#NetWorkAdapter 20121011.======================================== ...

  7. android中使用哪种方式解析XML比較好

    SAX是一个用于处理XML事件驱动的"推"模型. 长处是一种解析速度快而且占用内存少的xml解析器,它须要哪些数据再载入和解析哪些内容. 缺点是它不会记录标签的关系.而要让你的应用 ...

  8. Android中的测试类配置AndroidManifest.xml

    测试类至于要把一个类继承ActivityTestCase即可至于方法,根据需要自己建立方法:之后必须配置AnroidMainfest.xml文件 配置AndroidManifest.xml文件 1) ...

  9. 序列化之对象,字符串,byte数组,XML之间的转换(一)

    工作一年多了,越来越感到自己不能这样一直下去,在最好的青春里面却已经死了.被时间消磨了意志,被工作杀死了精神.我想,我只要活着,我就要去不断的要求自己,不断的去追求更高的山峰. 放眼四周,有趣的灵魂越 ...

随机推荐

  1. Creater中选择一行的方法

    1.  在表布局中增加一单选钮列,给单选钮的属性name任意设定一个值.2.  选择单选钮对应列,将其selectID设为单选钮的ID;将onclick设为setTimeout('initAllRow ...

  2. Best Time to Buy and Sell Stock

    class Solution { public: int maxProfit(vector<int>& prices) { //eg: 5 6 2 3 1 4: // 记录i之前最 ...

  3. Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具

    2.5.创建链式依赖 当你请求Ninject创建一个类型,它检查该类型的依赖是否声明.它也会检查该依赖是否依赖其他类型.如果这里有附加依赖,Ninject自动解决他们,并创建请求的所有类的实例.正是由 ...

  4. Java 中日期的几种常见操作 —— 取值、转换、加减、比较

    Java 的开发过程中免不了与 Date 类型纠缠,准备总结一下项目经常使用的日期相关操作,JDK 版本 1.7,如果能够帮助大家节约那么几分钟起身活动一下,去泡杯咖啡,便是极好的,嘿嘿.当然,我只提 ...

  5. Java 流程控制语句

    java的流程控制: 1.顺序结构 2.选择结构 a.关系运算.逻辑运算.条件运算 b.if语句 c.if-else语句.if - else if -else语句 d.switch语句. 3.循环语句 ...

  6. redis初试牛刀

    先来无事就学学redis.可是并没有想的那么美好.首先要解释一下,redis主流是安装在lunx系统中的,甚至官网直接没有给出windows版本.要下载windows只能去所谓的githup.好吧我在 ...

  7. windows上安装apache python mod_python

    综述:   windows上安装apache python mod_python的例子.教程甚至图解都不少:但作为新手还是会出错,而且一时无法快速排解. 在此笔者将根据自己的实践经验,给出几个需要注意 ...

  8. poj1703 Find them, Catch them

    并查集. 这题错了不少次才过的. 分析见代码. http://poj.org/problem?id=1703 #include <cstdio> #include <cstring& ...

  9. SHA1加密C#

    //SHA1 static public string SHA1_Hash(string str_sha1_in) { SHA1 sha1 = new SHA1CryptoServiceProvide ...

  10. 深入理解include预编译原理

    http://ticktick.blog.51cto.com/823160/596179 你了解 #include 某个 .h 文件后,编译器做了哪些操作么? 你清楚为什么在 .h文件中定义函数实现的 ...