Android:Parcelable和Serializable之间的区别?

为什么Android提供2个接口来序列化对象? 可串行化对象与Android Binder和AIDL文件进行交互吗?

在Android中,我们知道我们不能只将对象传递给活动。 这些对象必须是实现Serializable或Parcelable接口来执行此操作。

序列化

可串行化是一个标准的Java接口。 你可以实现Serializable接口并添加覆盖方法。这种方法的问题是使用reflection,这是一个缓慢的过程。 这种方法创build了大量的临时对象,并导致了相当多的垃圾收集。 可序列化的接口更容易实现。

看下面的例子(可序列化)

 //MyObjects Serializable class import java.io.Serializable; import java.util.ArrayList; import java.util.TreeMap; import android.os.Parcel; import android.os.Parcelable; public class MyObjects implements Serializable { private String name; private int age; public ArrayList<String> address; public MyObjects(String name, int age, ArrayList<String> address) { super(); this.name = name; this.age = age; this.address = address; } public ArrayList<String> getAddress() { if (!(address == null)) return address; else return new ArrayList<String>(); } public String getName() { return name; } public String getAge() { return age; } } //MyObjects instance MyObjects mObjects = new MyObjects("name","age","Address array here"); //Passing MyObjects instance via intent Intent mIntent = new Intent(FromActivity.this, ToActivity.class); mIntent.putExtra("UniqueKey", mObjects); startActivity(mIntent); //Getting MyObjects instance Intent mIntent = getIntent(); MyObjects workorder = (MyObjects) mIntent.getSerializableExtra("UniqueKey"); 

Parcelable

可序列化过程比可序列化要快得多。 其中一个原因是,我们正在清楚的序列化过程,而不是使用reflection来推断它。 也有理由认为,代码已经为此目的进行了大量的优化。

看下面的例子(Parcelable)

 //MyObjects Parcelable class import java.util.ArrayList; import android.os.Parcel; import android.os.Parcelable; public class MyObjects implements Parcelable { private int age; private String name; private ArrayList<String> address; public MyObjects(String name, int age, ArrayList<String> address) { this.name = name; this.age = age; this.address = address; } public MyObjects(Parcel source) { age = source.readInt(); name = source.readString(); address = source.createStringArrayList(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(age); dest.writeString(name); dest.writeStringList(address); } public int getAge() { return age; } public String getName() { return name; } public ArrayList<String> getAddress() { if (!(address == null)) return address; else return new ArrayList<String>(); } public static final Creator<MyObjects> CREATOR = new Creator<MyObjects>() { @Override public MyObjects[] newArray(int size) { return new MyObjects[size]; } @Override public MyObjects createFromParcel(Parcel source) { return new MyObjects(source); } }; } MyObjects mObjects = new MyObjects("name","age","Address array here"); //Passing MyOjects instance Intent mIntent = new Intent(FromActivity.this, ToActivity.class); mIntent.putExtra("UniqueKey", mObjects); startActivity(mIntent); //Getting MyObjects instance Intent mIntent = getIntent(); MyObjects workorder = (MyObjects) mIntent.getParcelable("UniqueKey"); //You can pass Arraylist of Parceble obect as below //Array of MyObjects ArrayList<MyObjects> mUsers; //Passing MyOjects instance Intent mIntent = new Intent(FromActivity.this, ToActivity.class); mIntent.putParcelableArrayListExtra("UniqueKey", mUsers); startActivity(mIntent); //Getting MyObjects instance Intent mIntent = getIntent(); ArrayList<MyObjects> mUsers = mIntent.getParcelableArrayList("UniqueKey"); 

结论。

  1. Parcelable比可序列化的接口更快
  2. 与可序列化接口相比,Parcelable接口需要更多时间来实现
  3. 可序列化的接口更容易实现
  4. 可序列化的接口创build了大量的临时对象,并导致相当多的垃圾收集
  5. Parcelable数组可以通过在Android中的意图传递

可串行化是一个标准的Java接口。 您只需通过实现接口标记一个Serializable类,Java将在某些情况下自动序列化它。

Parcelable是一个Android专用接口,您可以自己实现序列化。 它被创build为更有效率的Serializable,并解决一些与默认的Java序列化scheme的问题。

我相信Binder和AIDL使用Parcelable对象。

但是,您可以在Intents中使用Serializable对象。

如果您想成为一名优秀的公民,请花费额外的时间来实施Parcelable,因为它的执行速度会提高10倍,而且使用更less的资源。

但是在大多数情况下,Serializable的缓慢程度并不明显。 随意使用它,但请记住,序列化是一个昂贵的操作,所以保持在最低限度。

如果您试图通过一个包含数千个序列化对象的列表,则整个过程可能需要一秒多的时间。 它可以使从肖像到景观的过渡或旋转感觉非常缓慢。

来源到这一点: http : //www.developerphil.com/parcelable-vs-serializable/

实际上我将成为一个倡导Serializable的人。 速度差别不是那么激烈,因为这些设备比几年前好得多,还有其他更细微的差别。 有关更多信息,请参阅我的博客文章。

1.可串行化

@see http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

什么接口?

  • 是一个标准的Java接口

速度

  • 比Parcelable慢

2. Parcelable

@请参阅http://developer.android.com/reference/android/os/Parcelable.html

什么接口?

  • 是android.os接口
    • 这意味着Google在Android上开发了Parcelable以获得更好的性能

速度

  • 更快(因为它在Android开发上的使用进行了优化)

>总结

请注意,Serializable是一个标准的Java接口,Parcelable是用于Android开发的

关于编组和解组有一些性能问题。 Parcelable比Serializable快两倍。

请通过以下链接:

http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development

在Parcelable中,开发人员编写自定义代码进行封送和反编组,因此与序列化相比,它创build的垃圾对象更less。 由于这个自定义的实现,Parcelable over Serialization的性能大大提高了(大约快两倍)。

序列化是一个标记接口,这意味着用户不能按照他们的要求编组数据。 在序列化中,使用JavareflectionAPI在Java虚拟机(JVM)上执行封送处理操作。 这有助于识别Java对象的成员和行为,但最终也会创build大量的垃圾对象。 由于这个原因,序列化过程比Parcelable慢。

如果你在android studio中使用了paracelable插件,parcelable的实现可以更快。 searchAndroid Parcelable代码生成器

Serializable接口可以像Parcelable接口一样使用,导致(不是很多)更好的性能。 只需重写这两个方法来处理手动编组和解组过程:

 private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException 

不过,在我看来,在开发原生Android的时候,使用Android API是最好的select。

参见:

可比用Binder可序列化更快,因为可序列化使用reflection并导致很多GC。 Parcelable是devise优化传递对象。

这里是参考的链接。 http://www.developerphil.com/parcelable-vs-serializable/

你可以在intents中使用可序列化的对象,但在序列化一个Parcelable对象的时候,它可以给出一个严重的exception,如NotSerializableException。 是不是推荐使用可序列化与Parcelable。 所以最好将Parcelable扩展到你想要使用bundle和intents的对象。 由于这个Parcelable是Android专用的,所以它没有任何副作用。 🙂