객체를 전달하는 두 가지 방법(Serializable, Parcelable)과 그 차이점

3396 단어
Intent는 자바의 기본 데이터 형식을 전달할 수 있을 뿐만 아니라 클래스의 대상도 전달할 수 있다. 전제는 이런 클래스가 반드시 Serializable 또는 Parcelable 인터페이스를 실현해야 한다는 것이다.
Serializable 인터페이스를 실현하는 방식은 대상의 서열화와 반서열화를 통해 대상 전달을 실현한다.
Parcelable 인터페이스를 실현하는 방식은 write ToParcel을 통해 당신의 대상을 Parcel 대상으로 비추고,create FromParcel을 통해 Parcel 대상을 당신의 대상으로 비추는 것입니다.또한 Parcel을 하나의 흐름으로 볼 수 있다. write ToParcel을 통해 대상을 흐름 안에 쓰고 create FromParcel을 통해 흐름에서 대상을 읽는다. 단지 이 과정은 네가 실현해야 하기 때문에 쓰는 순서와 읽는 순서가 일치해야 한다.
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) Intent에서 객체를 전달하기 위해 Parcelable 인터페이스를 사용하는 이유는 무엇입니까?
a. 메모리를 사용할 때 Parcelable가 Serializable보다 성능이 높기 때문에 Parcelable 클래스를 사용하는 것을 추천합니다.
b. Serializable는 서열화할 때 대량의 임시 변수가 발생하여 빈번한 GC를 일으킨다.
 
참고: Parcelable는 데이터를 디스크에 저장하는 데 사용할 수 없습니다. 왜냐하면 Parcelable는 데이터의 지속성이 외부에서 변화하는 상황에서 잘 저장되지 않기 때문입니다.따라서 이 경우 Serializable을 사용하는 것이 좋습니다.
      
2) Android의 새로운 시리얼화 메커니즘
안드로이드 시스템에서는 메모리가 제한된 모바일 장치에 대한 성능 요구가 높기 때문에 안드로이드 시스템은 새로운 IPC(프로세스 간 통신) 메커니즘을 채택하여 성능이 더욱 뛰어난 대상 전송 방식을 사용하도록 요구한다.따라서 Parcel 클래스는 경량급의 효율적인 대상 서열화와 반서열화 메커니즘으로 설계되었다.
Parcel의 서열화와 반서열화 읽기와 쓰기는 모두 메모리에서 이루어지기 때문에 JAVA 서열화에서 외부 메모리를 사용하는 것보다 효율이 훨씬 높다.
 
Parcel 클래스
응용 프로그램의 경우 Parcel 클래스를 자주 사용하는 장면은Activity 간에 데이터를 전달하는 것이다.Activity 간에 Intent를 사용하여 데이터를 전달할 때 Parcelable 메커니즘을 통해 복잡한 객체를 전달할 수 있습니다.
Parcel 메커니즘: 본질적으로 그것을 하나의 Serialize로 생각하면 된다.다만 Parcel의 객체는 실제 메모리에서 완성된 서열화와 반서열화로 연속적인 메모리 공간을 이용하기 때문에 더욱 효율적이다.
    
사례:
단계 1: 솔리드 클래스를 사용자 정의하여 Parcelable 인터페이스를 구현하고 두 가지 메서드를 재작성합니다.
단계 2: 이 실체 클래스는 상수 CREATOR을 추가해야 합니다. 이 상수는 Parcelable의 내부 인터페이스인 Parcelable를 실현해야 합니다.Creator 및 인터페이스의 두 가지 방법을 구현합니다.
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
 }

좋은 웹페이지 즐겨찾기