1、为何要序列化?
-- 把内存中的java对象能够在磁盘上持久保存
-- 通过网络传输对象
-- 通过RMI(Remote Method Invocation 远程过程调用)传输。
通过序列化可以把对象转化为与平台无关的二进制流,在重新使用前进行反序列化,重新转化为java对象。
(远程过程调用针对分布式Java应用,对开发人员屏蔽不同JVM和网络连接等细节,是的分布在不同JVM上的对象似乎存在于一个统一的JVM中,能够方便的通讯)
2、如何让Java对象可以被序列化?
在java里只需让目标类实现Serializable接口,无须实现任何方法。Serializable接口是一种标记接口,用来标明某个类可以被序列化。
3、如何使用序列化与反序列化?
序列化:使用ObjectOutputStream对象输出流的writeObject()方法,可以把对象写到输出流中。
反序列化:使用ObjectInputStream对象写入流的readObject()方法,并强制转换为已知的目标类即可。
4、对象引用的序列化
如果一个类Person某个成员变量引用了其他类(如class PersonInfo)。即:
class Person implements Serializable{ String name; PersonInfo info; }
如果想将Person类进行序列化,那么必须要满足:PersonInfo类也能够序列化,即也实现了Serializable接口,
class PersonInfo implements Serializable
5、多个对象引用同一个子对象
PersonInfo info = new PersonInfo(“male”,"china"); Person xiaomi = new Person("小明",info); Person dabai = new Person("大白",info);
如果依次对上面三个对象序列化,原本是下面两个对象都指向上面同一个对象,也就是指存在一个info对象,java为了防止在每个对象序列化时序列化三个info对象,设定了如果多次序列化同一样java对象时,只有在第一次序列化时把这个对象转换为字节序列输出,之后再对它序列化只会指向第一次序列化的编号,而不会再去序列化这个对象。
6、父类序列化
如果父类实现了Serializable接口,则子类自动可序列化,不需要再显示实现该接口。
7、利用Serializable保存自定义数据至本地的例子
MainActivity如下:
package cc.test.serializable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.os.Environment; /** * Demo描述: * 将ArrayList<自定义数据>在SDCard上进行存取. * * Parcelable和Serializable的区别: * 内存间数据传输时推荐使用Parcelable,如activity间传输数据 * 比如:http://blog.csdn.net/lfdfhl/article/details/10961459 * 保存到本地或者网络传输时推荐使用Serializable */ public class TestSerializableActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); testSerializable(); } private void testSerializable() { FileOutputStream fileOutputStream=null; ObjectOutputStream objectOutputStream =null; FileInputStream fileInputStream = null; ObjectInputStream objectInputStream = null; ArrayList<Student> studentsArrayList = new ArrayList<Student>(); Student student = null; for (int i = 1; i < 5; i++) { student = new Student(i, "小明" + i); studentsArrayList.add(student); } try { //存入数据 File file = new File(Environment.getExternalStorageDirectory().toString() + File.separator +"Test"+File.separator + "data.dat"); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } if (!file.exists()) { file.createNewFile(); } fileOutputStream= new FileOutputStream(file.toString()); objectOutputStream= new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(studentsArrayList); //取出数据 fileInputStream = new FileInputStream(file.toString()); objectInputStream = new ObjectInputStream(fileInputStream); ArrayList<Student> savedArrayList =(ArrayList<Student>) objectInputStream.readObject(); for (int i = 0; i < savedArrayList.size(); i++) { System.out.println("取出的数据:" + savedArrayList.get(i).toString()); } } catch (Exception e) { // TODO: handle exception }finally{ if (objectOutputStream!=null) { try { objectOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileOutputStream!=null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (objectInputStream!=null) { try { objectInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileInputStream!=null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
Student如下:
package cc.test.serializable; import java.io.Serializable; public class Student implements Serializable { private Integer id; private String name; //注意定义此字段 public static final long serialVersionUID = 9527L; public Student() { super(); } public Student(Integer id, String name) { super(); this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
main.xml如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
本文向大家介绍Android中Serializable和Parcelable序列化对象详解,包括了Android中Serializable和Parcelable序列化对象详解的使用技巧和注意事项,需要的朋友参考一下 本文详细对Android中Serializable和Parcelable序列化对象进行学习,具体内容如下 学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Par
本文向大家介绍C#中Serializable序列化实例详解,包括了C#中Serializable序列化实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中Serializable序列化。分享给大家供大家参考。具体分析如下: 概述: 序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件 中。例如,可以序列化一个对象,然后使用 HTTP 通过 I
本文向大家介绍JAVA序列化Serializable及Externalizable区别详解,包括了JAVA序列化Serializable及Externalizable区别详解的使用技巧和注意事项,需要的朋友参考一下 序列化简介 Java 的对象序列化将那些实现 Serializable 接口的对象转换成一个字节序列,并能在之后将这个字节序列完全恢复为原来的对象。 这就意味着 Java 对象在网络上
本文向大家介绍PHP自定义序列化接口Serializable用法分析,包括了PHP自定义序列化接口Serializable用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP自定义序列化接口Serializable用法。分享给大家供大家参考,具体如下: PHP Serializable是自定义序列化的接口。实现此接口的类将不再支持__sleep()和__wakeup(),当类的实
问题内容: 现在完成XML SAX解析之后,我将在应用程序中进行JSON解析。我在这里为您提供杰森 现在,我提到了一个Json解析的示例,在该示例中,他们创建了一个jString对象,我对此特定行有疑问,如下所示: 任何人都可以让我澄清一下。完整示例的链接如下: http://www.androidcompetencycenter.com/2009/10/json-parsing-in- andr
JSON 之所以流行,拥有与JavaScript 类似的语法并不是全部原因。更重要的一个原因是,可以把JSON 数据结构解析为有用的JavaScript 对象。与XML 数据结构要解析成DOM 文档而且从中提取数据极为麻烦相比,JSON 可以解析为JavaScript 对象的优势极其明显。就以上一节中包含一组图书的JSON数据结构为例,在解析为JavaScript 对象后,只需要下面一行简单的代码