[Android] Parcelable 간단 예제

2 분 소요

Parcelable 간단 예제

 public class SimpleData implements Parcelable {
 
    String name;
 
    int number;
 
    TestData testdata;
 
 
 
    public SimpleData(String name, int number) {
 
        Log.d("테스트","public SimpleData(String name, int number){\nthis.name = name;\nthis.number = number;}");
 
        this.name = name;
 
        this.number = number;
 
    }


    //parcel 에다가 데이터 저장함. 굳이 name number 아니여도 아무거나 다됨. 예를들어 bluteGatt 객체면 Gatt.uuid, Gatt.bluetooth 모듈 등등
 
    //bluetooth gatt 객체는 pacelable 을 지원하며, parcel 안쓰는게 좋다고함. 싱글톤으로 접근하는게 좋다고함.
 
    @Override
 
    public void writeToParcel(Parcel parcel, int flags) {
 
        Log.d("테스트","\nwriteToParcel(Parcel parcel, int flags){\nparcel.writeString(name);\nparcel.writeInt(number);}");
 
        parcel.writeString(name);
 
        parcel.writeInt(number);
 
    }
 
 
 
    //createFromParcel 에서 실행, parcel에서 String, read 읽고 SimpleData 그자체를 리턴함
 
    protected SimpleData(Parcel parcel) {
 
        Log.d("테스트","\nSimpleData(Pacel parcel){\nname = pacel.readString();\nnumber = parcel.readInt();}");
 
        name = parcel.readString();
 
        number = parcel.readInt();
 
    }
 
    @Override
 
    public int describeContents() {
 
        Log.d("test","describeContents() -> return 0;");
 
        return 0;
 
    }
 
    /*
    parcel.readvalue(Classloader loader);
    구획에서 입력된 객체를 읽습니다. 지정된 클래스 로더는 동봉된 'Parcelables'를 로드하는 데 사용됩니다. Null이면 기본 클래스 로더가 사용됩니다.
    parcel.dataCapacity();
    구획의 총 공간을 반환합니다. 항상 >= dataSize입니다. 데이터 크기와 데이터 크기()의 차이는 구획이 데이터 버퍼를 재할당해야 할 때까지 남은 공간의 양입니다.
    parcel.dataAvail();
    구획에서 읽을 남은 데이터 양을 반환합니다. 즉, dataSize-dataPosition입니다.
    parcel.setDataCapacity(int size);
    구획의 용량(현재 사용 가능한 공간)을 변경합니다.
    parcel.recycle();
    'Parcel 객체'를 다시 '풀'에 넣습니다. 이 호출 후에는 개체를 만지면 안 됩니다. (메모리 해제인듯?)
    parcel.marshall();
    'parcel'의 원시 바이트를 반환합니다.
    여기서 검색하는 데이터는 로컬 디스크, 네트워크를 통해 어떤 종류의 영구 저장소에도 저장해서는 안 됩니다.
    그러려면 표준 직렬화 또는 다른 종류의 일반 직렬화 메커니즘을 사용해야 합니다.
    'Parcel marshalled representation'은 로컬 IPC에 매우 최적화되어 있으므로 플랫폼의 다른 버전에서 생성된 데이터와의 호환성을 유지하려고 하지 않는다.
    */



     public static byte[] Serialiazing_TestData(String name, int age, String text){
 
        byte[] SreializedTestData = null;
 
        try {
 
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
 
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
 
 
 
            TestData testData = new TestData(name, age, text);
 
            objectOutputStream.writeObject(testData);
 
            SreializedTestData = byteArrayOutputStream.toByteArray();
 
            return SreializedTestData;
 
        } catch (Exception e) {
 
            e.printStackTrace();
 
        }
 
        return SreializedTestData;
    }



    //Creator<T> 인터페이스 구현
    /**
     * public CREATOR로 구현 및 제공해야 하는 인터페이스
     * Paccel에서 Parcelable 클래스의 인스턴스를 생성하는 필드입니다.
     */
 
    public static final Creator<SimpleData> CREATOR = new Creator<SimpleData>() {
 
        /**
         * 'Parcelable' 클래스의 새 인스턴스를 만들어 인스턴스화합니다.
         * 데이터가 이전에 작성된 적이 있는 지정된 'Parcel'에서
         * {@link Parcelable#writeToParcel Parcelable.Parcel()에 씁니다.
         *
         * @param source 객체의 데이터를 읽을 구획.
         * @Parcelable 클래스의 새 인스턴스를 반환합니다.
         */
 
        @Override
 
        public SimpleData createFromParcel(Parcel parcel) {
 
            Log.d("테스트","\ncreateFromParcel(Parcel parcel){\nReturn new SimpleData(parcel)}");
 
            return new SimpleData(parcel);
 
        }
 
 
 
 
        /**
         * 구획 가능 클래스의 새 배열을 만듭니다.
         *
         * @param size 배열의 크기.
         * @Return 모든 항목이 포함된 구획 가능 클래스의 배열을 반환합니다.
         * null로 초기화되었습니다.
         */
 
        @Override
 
        public SimpleData[] newArray(int size) {
 
            return new SimpleData[size];
 
        }
 
    };



    /**
     * 수신이 가능한 {@link Creator}의 전문화
     * ClassLoader에서 객체를 생성 중입니다.
     */
 
    public static final ClassLoaderCreator<SimpleData> CLASS_LOADER_CREATOR = new ClassLoaderCreator<SimpleData>() {
 
 
        /**
         * Parcelable 클래스의 새 인스턴스 생성, 인스턴스화
         * 데이터가 이전에 작성된 Parcel의 데이터
         * {@link Parcelable#writeToParcel Parcelable.Parcel()에 쓰기
         * 지정된 ClassLoader를 사용합니다.
         *
         * @param source 객체의 데이터를 읽을 구획.
         * @param loader 이 개체를 만들고 있는 ClassLoader.
         * @Parcelable 클래스의 새 인스턴스를 반환합니다.
         */
        @Override
 
        public SimpleData createFromParcel(Parcel source, ClassLoader loader) {
 
            return null;
 
        }
 
 
 
        @Override
 
        public SimpleData createFromParcel(Parcel source) {
 
            return null;
 
        }
 
 
 
        @Override
 
        public SimpleData[] newArray(int size) {
 
            return new SimpleData[0];
 
        }
 
    };
 
}