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");
结论。
- Parcelable比可序列化的接口更快
- 与可序列化接口相比,Parcelable接口需要更多时间来实现
- 可序列化的接口更容易实现
- 可序列化的接口创build了大量的临时对象,并导致相当多的垃圾收集
- 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专用的,所以它没有任何副作用。 🙂