`

Intent传递对象——Serializable和Parcelable区别

 
阅读更多

Intent在不同的组件中传递对象数据的应用非常普遍。下面介绍两种通过Intent传递对象的方法。

1、实现Serializable接口

2、实现Parcelable接口

 

为什么要将对象序列化?

 1、永久性保存对象,保存对象的字节序列到本地文件中;

 2、用过序列化对象在网络中传递对象;

 3、通过序列化对象在进程间传递对象。

 

1、实现Serializable接口

    Serializable的作用是将数据对象存入字节流当中,在需要时重新生成对象,主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。

    implements Serializable接口的的作用就是给对象打了一个标记,系统会自动将其序列化。

    

    案例1:

 1)User.java  (implements Serializable )

 2)MainActivity.java  

     User user = new User();

     Intent intent = new Intent(this,Second.class);  

     intent.putExtra("user",user);

 3)Second.java

     Intent intent = getIntent();

     User user = intent.getSerializableExtra("user");

 

2、实现Parcelable接口

     1)为什么要实现Parfcelable接口来实现在Intent中传递对象?

      a、在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable类。

      b、Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

 

     注意:Parcelable不能使用在将数据存储在磁盘上的情况,因为Parcelable不能很好的保存数据的持续性在外界有变化的情况下。因此在这种情况下,建议使用Serializable

      

     2) Android中的新的序列化机制

     在Android系统中,针对内存受限的移动设备,因此对性能要求更高,Android系统采用了新的IPC(进程间通信)机制,要求使用性能更出色的对象传输方式。因此Parcel类被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。

     Parcel的序列化和反序列化的读写全是在内存中进行,所以效率比JAVA序列化中使用外部存储器会高很多。

 

Parcel类

     就应用程序而言,在常使用Parcel类的场景就是在Activity间传递数据。在Activity间使用Intent传递数据的时候,可以通过Parcelable机制传递复杂的对象。

     Parcel机制:本质上把它当成一个Serialize就可以了。只是Parcel的对象实在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此更加高效。

    

案例:

    步骤1:自定义实体类,实现Parcelable接口,重写其两个方法。

    步骤2:该实体类必须添加一个常量CREATOR(名字大小写都不能使其他的),该常量必须实现Parcelable的内部接口:Parcelable.Creator,并实现该接口中的两个方法。

    User.java如下:

package com.example.intent_object;

import android.os.Parcel;
import android.os.Parcelable;

public class User implements Parcelable {
	public String name;
	public int age;

	// 必须要创建一个名叫CREATOR的常量。
	public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
		@Override
		public User createFromParcel(Parcel source) {
			return new User(source);
		}
		//重写createFromParcel方法,创建并返回一个获得了数据的user对象
		@Override
		public User[] newArray(int size) {
			return new User[size];
		}
	};

	@Override
	public String toString() {
		return name + ":" + age;
	}

	// 无参数构造器方法,供外界创建类的实例时调用
	public User() {
	}

	// 带参构造器方法私用化,本构造器仅供类的方法createFromParcel调用
	private User(Parcel source) {
		name = source.readString();
		age = source.readInt();
	}

	@Override
	public int describeContents() {
		return 0;
	}

	// 将对象中的属性保存至目标对象dest中
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeString(name);
		dest.writeInt(age);
	}

  //省略getter/setter }
 

 

    其他代码:

Bundle bundle = new Bundle();
					bundle.putParcelable("user", user);
					Intent intent = new Intent(MainActivity.this,
							SecondActivity.class);
					intent.putExtras(bundle);

 

  

	Intent intent = getIntent();
			Bundle bun = intent.getExtras();
			User user = bun.getParcelable("user");
			System.out.println(user);

 

 

分享到:
评论

相关推荐

    Android序列化——Serializable与Parcelable

    - 性能高效,Parcelable比Serializable快很多,适合频繁的序列化操作,如传递Intent。 - 数据存储更紧凑,占用内存小,适合内存敏感的场景。 缺点: - 实现过程相对复杂,需要编写额外的序列化和反序列化代码。 - ...

    Intent传递对象之Serializable和Parcelable的区别

    大家都知道在intent传递对象的方法有两种:1、实现Serializable接口、2、实现Parcelable接口,接下来通过本文给大家介绍Intent传递对象之Serializable和Parcelable的区别,感兴趣的朋友一起学习吧

    Android 数据传递(Intent、Bundle、Serializable、Parcelable等)

    数据通过Intent.putExtra()方法添加,支持基本数据类型(如字符串、整型、浮点型)以及Parcelable和Serializable对象。当Intent传递的数据量较小或不涉及复杂对象时,Intent是非常方便的选择。 2. **Bundle**: ...

    android中Intent传递对象的两种方法(Serializable,Parcelable)

    当我们需要在Intent中传递复杂对象时,有两种主要的方法:Serializable和Parcelable。这两种方式都可以实现对象的序列化,但它们在性能和效率上存在差异。 **Serializable接口** Serializable接口是Java提供的一个...

    Intent传递对象Serializable

    在Android中,Intent的额外数据部分(extras)只能存储Parcelable或Serializable类型的对象,因此,当我们需要通过Intent传递自定义对象时,可以选择实现Serializable接口。 **步骤1:实现Serializable接口** 为了...

    Intent传递对象

    本篇文章将深入探讨如何通过Intent传递对象,以及涉及到的序列化方式——Serializable和Parcelable。 首先,Intent主要分为显式Intent和隐式Intent。显式Intent明确指定要启动的目标组件,而隐式Intent则通过ACTION...

    Android Intent传递对象

    当我们需要在Intent中传递复杂对象时,Android提供了两种序列化方式:Serializable和Parcelable。本文将深入探讨这两种方式以及如何在Intent中传递对象。 一、Serializable接口 Serializable是Java内置的序列化接口...

    Intent传递对象、对象数组

    总结,Intent在Android开发中扮演着核心角色,通过实现Parcelable接口,我们可以顺利地在Intent中传递对象和对象数组,实现不同组件之间的数据交互。在实际开发中,根据具体需求和性能要求选择合适的数据传递方式。

    Android中Intent传递对象的两种方法(Serializable,Parcelable)

    Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable...

    Android中Intent传递对象的两种方法Serializable,Parcelable

    然而,当我们需要传递更复杂的数据结构,如自定义对象时,就需要借助于`Serializable`和`Parcelable`接口。这两个接口都是为了实现对象的序列化和反序列化,使得对象能够在内存或不同进程间传递。 1. **...

    Android Intent传递数据大小限制详解

    Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。 Intent传递数据时,如果数据太大,可能会出现异常。比如App闪退,或是Intent发送不成功,logcat...

    android Intent传递对象数据

    在Intent中传递和接收对象: ```java Intent intent = new Intent(context, TargetActivity.class); intent.putExtra("myObject", myObject); startActivity(intent); // 在TargetActivity中 MyObject ...

    Android系列之Intent传递对象的几种实例方法

    本篇文章将详细探讨如何通过Intent在Android中传递对象,主要分为两种方式:使用`Serializable`接口和`Parcelable`接口。 1. **Serializable接口** `Serializable`是Java提供的一个标准序列化接口,当一个类实现了...

    Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

    Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle....

    Android 通过Intent使用Bundle传递对象详细介绍

    被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在...

Global site tag (gtag.js) - Google Analytics