Android中数据序列化之Serializable与Parcelable
fdsfsdjf3
8年前
<ul> <li> <h3>Serializable</h3> </li> </ul> <pre> <code class="language-java">序列化Serializable是Java语言的特性之一,是将java对象转换成字节序列的过程,与之对应的是反序列化。反序列化是将字节序列转化为java对象的过程。 Serializable通过实现接口进行标志,只要定义的Java对象实现了Serializable接口,不有实现任何方法,java就会对该对象 诸如对如下类进行序列化及反序列化操作 public class SerDemo implements Serializable { //开发工具提示生成的serialVersionUID private static final long serialVersionUID = 4046555564483893134L; private int age; //ArrayList已经实现了序列化接口 private ArrayList<BannerImg> bannerImgs; public class BannerImg implements Serializable { private static final long serialVersionUID = -344227642091683711L; public String mIconUrl; public String mValue; public BannerImg(String mIconUrl, String mValue) { this.mIconUrl = mIconUrl; this.mValue = mValue; } } public SerDemo() { this.age = 0; this.bannerImgs = new ArrayList<>(); } }</code></pre> <p>对SerDemo进行序列化及反序列化操作示例:</p> <pre> <code class="language-java">//序列化需要把对象转换成诸如FileOutputSream等输出流,再转成ObjectOutputSteam,然后调用相应方法序列化保存到文件。 private void writeToCache(SerDemo banner) { FileOutputStream fos = null; ObjectOutput objectOutput = null; //判断sd卡是否存在 if (Environment.getExternalStorageState() .equals(android.os.Environment.MEDIA_MOUNTED)) { //将指定WenkuBanner对象序列化到SD卡中 try { //文件路径最好是灵活配置 File file = new File(Environment.getExternalStorageDirectory() + "/ldm"); fos = new FileOutputStream(file); objectOutput = new ObjectOutputStream(fos); if (objectOutput != null) { objectOutput.writeObject(banner); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != fos) { fos.close(); } if (null != objectOutput) { objectOutput.close(); } } catch (IOException e) { e.printStackTrace(); } } } else { //提示SD卡不存在 } } //模拟把一个Java对象反序列化 //反序列化需要把文件数据转换成诸如FileInputSream等输入流,再转成ObjectInputSteam,然后调用相应方法转成对象。 private SerDemo readFromCache() { File file = null; FileInputStream fis = null; ObjectInputStream ois = null; SerDemo banner = null; if (Environment.getExternalStorageState() .equals(android.os.Environment.MEDIA_MOUNTED)) { //将指定WenkuBanner对象序列化到SD卡中 try { //文件路径最好是灵活配置 file = new File(Environment.getExternalStorageDirectory() + "/ldm"); //这里还要判断文件是否存在 fis = new FileInputStream(file); ois = new ObjectInputStream(fis); if (null != ois) { //获取到WenkuBanner对象 banner = (SerDemo) ois.readObject(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != fis) { fis.close(); } if (null != ois) { ois.close(); } } catch (IOException e) { e.printStackTrace(); } } } else { //提示SD卡不存在 } return banner; }</code></pre> <ul> <li> <h3>Parcelable</h3> <p>Parcelable是AndroidSDK提供的一种基于内存读写的高速序列化操作。在Android跨进程数据通讯中 数据对象一般要求实现Parcelable接口,实现Parcelable指定的方法。</p> <p>比如对下面类通过Parcelable进行序列化及反序列化</p> </li> </ul> <pre> <code class="language-java">public class ParcelDemo implements Parcelable { private String name; private int age; private String subjcet; public ParcelDemo() { } //从Parcel中获取变量的内容 protected ParcelDemo(Parcel in) { this.name = in.readString(); this.age = in.readInt(); this.subjcet = in.readString(); } public static final Creator<ParcelDemo> CREATOR = new Creator<ParcelDemo>() { //反序列化方法,将writeToParcel方法写入的Parcel反序列成ParcelDemo @Override public ParcelDemo createFromParcel(Parcel in) { return new ParcelDemo(in); } //这个方法是提供给其它类反序列化该类的数组时调用 @Override public ParcelDemo[] newArray(int size) { return new ParcelDemo[size]; } }; //接口内容描述 ,通常返回0即可 @Override public int describeContents() { return 0; } //实现序列化操作的方法,将类数据写到Parcel窗口中 @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(name); parcel.writeInt(age); parcel.writeString(subjcet); } } 开发工具实现Parcelable只会提示你要实现的方法,如果在AndroidStuiod中安装了Parcelable Code Generator插件, 就会在提示生成方法时自动添加对应代码,非常方便。</code></pre> <p> </p> <p>来自:http://www.androidchina.net/6560.html</p> <p> </p>