직렬화 오브젝트 인텐트(직렬화:메모리 객체를 디스크에 저장하거나 네트워크를 통해 전송되는 형식으로 변환되는 작업)
데이터 덩어리인 텐트-안드로이드에서 사용하는 인테르트는 사실 데이터 덩어리일 뿐이다.-인텐트 클래스 내부적으로 특별한 기능이 존재하지 않는다는 의미. 특징 -인텐트에 수많은 프리미티브 타입 데이터와 기타(배열, int형..) 직렬화된 데이터를 넣어 하나로 묶어 직렬화 데이터 덩어리로 만들 수 있다는 점이다.- 여기서 인테르트를 단순히 직렬화된 데이터 덩어리로만 봐 달라.순서대로 직렬화 오브젝트를 살펴보자 Primitive타입 Serializabla타입 Parcel타입 Parcelable타입 Bundle타입 Intent타입
Primitive 타입 직렬화 객체
프리미티브 타입이란?boolean, byte, char, short, int, long, float, String 등의 가공되지 않은 순수한 자료형을 말한다.
이러한 자료형은 각각 메모리에 분리하여 할당되지 않는다.예를 들어 int형은 4byte를 사용하는 자료형이다. 만약 inta=0으로 변수를 선언하면 메모리에는 4byte 연속된 메모리에 할당하는 것이다.따라서, 프리미티브 타입 오브젝트는 그 자체가 직렬화 오브젝트이며 별도의 처리없이 다른 프로세스로 전달할 수 있는 상태이다.프리미티브 타입 변수 자체를 전달하는 일은 드물고 많은 프리미티브 타입 변수를 클래스 내에 정의하고 객체화한다.int는 메모리에 4byte로 올라간다. 자체는 직렬화인데 예를 들어 float과 int형은 직렬화가 아니다.
하지만 문제는 클래스를 객체화하면 내부 프리미티브 타입 변수가 서로 연속된 메모리에 할당되지 않아 직렬화 객체가 될 수 없다는 점이다.따라서, SampleClass 클래스를 직렬화하는 방법이 필요하다. 이를 위해 Java의 Serializable 인터페이스를 사용해야 한다.
Serializable 유형 직렬화 객체

직렬화되지 않은 클래스 메서드: 데이터를 받아 처리, 메서드는 절대 상태가 변하지 않는다. 정적 변수: 동적

패키지명까지 동일해야 한다. 나는 객체를 보냈지만 메서드는 가지 않고 실제 데이터가 전달된다.

자바서리얼izable 인터페이스를 계승한 직렬화 객체 마커 인터페이스(기록) private static finallonserial Version UID -> 반드시 이대로 써야 한다. 나중에 10000L;는 직렬화된 버전이라고 생각하면 된다.내가 수정하고 버전을 바꾸면 다른 프로젝트 중에 같은 패키지 이름, 같은 클래스 안에도 버전을 바꿔야 한다.

Serializable 오브젝트를 직접 전송 B 앱에서는 패키지 이름이 다르다. 그래서 따로 하나 만들어야 한다.패키지명, 클래스명은 반드시 동일하게 하여야 한다. 만약 다르게 쓴다면, 이 부분에서는 에러가 나지 않고 그대로 튕겨버린다.

AActivity

BATivity Sample Data sample Data=(Sample Data) intent… 반드시 명시적인 형태 변환을 해야 한다.

Serializable 활용 Serializable 인터페이스는 프로세스 간 통신을 위해서만 활용되는 것이 아니다.예를 들어 파일에 사용하거나 네트워크를 이용해 다른 단말기나 서버로 전송할 때 활용되기도 한다. 그 과정을 위의 그림으로 표현한 것이다.
Person을 Serial zable을 이용하여 활용 다른 프로젝트 간에

chap07의 Main

chap07의 Person

chap 프로젝트 패키지 생성 방법

패키지 생성 방법

같은 패키지명!Another 패키지 안에 chap07. Person 복사 Another.chap07 안에 chap07. Person 부착

Another 프로젝트

another Person

another 메인 클래스 버튼을 클릭하면

버튼을 클릭하면
parcel 타입 직렬화 객체 Parcel 클래스는 안드로이드에서 IPC 전용 데이터로 사용하기 위해 만들어진 클래스이다.따라서 프로세스간의 데이터 전달에 최적화되어 속도가 매우 빠르다.그렇다면 무조건 Parcel 클래스를 사용해야 할까.안드로이드(Android)는 굳이 Parcel 객체를 사용하지 않고도 내부적으로 전송되는 데이터는 Parcel 오브젝트로 변환하여 전송한다.다만 직접 Parcel 객체를 사용하면 변환 과정을 거치지 않기 때문에 더 성능이 좋다.(효율적인 데이터 전송)

빨간 사각 상자 → 내부적으로 parcel 형태로 전환된다. 커널 메모리에 실리다


Parcel 예제 set DataPosition=처음에 데이터를 올린다.

순서를 반드시 동일하게 해야 하므로 Parcel은 단독으로 사용하지 않으며 Parcelable을 통해 사용
Prarcelable 타입 직렬화 객체 Parcelable 클래스는 일종의 Parcel 데이터를 사용하는 설명서와도 동일하다.그 이유는 Parcelable 클래스 내부에 Parcel 데이터를 읽고 쓰는 함수를 구현하기 위해서이다.많은 데이터를 주고받을 때 사용/복잡함에도 불구하고 효율이 좋다!

Parcelable은 비어있는 아이가 아니다.

writeToParcel 메소드 송진 직전 자동호출
dest.writeInt(mIntData); 스스로 설정해야 한다. start Activity 하기 직전에 가져온다.dest.writeString(mStrData);

여기서 빨간 글씨로 Sample Data는 아래 sample Data이다.



Person 2 Parcelable



Main Person 2 클래스



anotherperson2 동일

버튼을 눌렀을 때 실행 결과 Parcelable은 프리미티브 타입 변수를 몇 개 전달할 경우 매우 불편하다.
Parcelable 클래스를 구현해야 한다.구현된 Parcelable 클래스 파일을 송신측 앱에 배포해야 한다.만약 구현된 Parcelable 클래스가 변경된 경우, 다시 송신측 앱으로 수정 Parcelable 클래스를 공유해야 한다.이를 위해 안드로이드는 Bundle 클래스를 제공한다.
Bundle 타입 직렬화 객체 키와 값을 가지고 있는 것, 인테르트에 포함되어 있다.

- 반토클래스 Parcelable 클래스를 계승하여 구현된 클래스입니다.- 안드로이드 SDK 라이브러리에 포함되어 있기 때문에 클래스 파일 자체를 배포할 필요가 없다.- 번들은 모든 유형의 직렬화 객체를 넣을 뿐만 아니라 Parcel과는 다르게 읽고 쓰는 순서를 일치시킬 필요가 없다.- 번들은 자바 컬렉션 프레임워크(JAVACollection Framework)의 맵맵과 같은 방식으로 데이터를 읽고 쓴다.즉 키와 값 형식으로 사용한다. 실제로 번들 내부에는 맵을 사용한다.

우리가 예전에 쓰던 putExtra와 비슷하다.키와 값을 가지고 있다.받을 때 변수를 통해 받아야 하는 get(변수자료형) 정확하게 받기 위해 오류가 나는 것을 제거하는 것이다.


직렬화 오브젝트 정리 Primitive 유형:프리미티브 유형은 순수 자료형이므로 클래스의 멤버 변수로 존재한다.따라서, 직접 프로세스 통신을 위한 객체로 활용되지 않는다.Serializable 유형: 클래스 자체를 직렬화 객체로 만들 수 있다. 하지만 클래스 파일을 송신측에 배포해야 하고 안드로이드 전용 직렬화 객체가 아니기 때문에 다소 느리다.Parcel 타입: 안드로이드 IPC를 담당하는 바인더가 사용하는 직렬화 객체이다. 따라서 전송속도가 매우 빠르다.그러나 데이터를 읽고 쓰는 순서를 지켜야 한다. 단독으로는 사용되지 않는다.Parcelable 유형: Parcel 객체의 데이터를 읽고 쓰는 순서를 정의한 클래스이다. Serializable과 같이 클래스 파일을 송신측에 배포해야 하는 단점이 있다. 또한, 프리미티브 자료형이나 다른 직렬화 객체를 몇 개 전달하기 위해서는 항상 Parcelable 클래스를 구현해야 한다.Bundle 유형: 번들 대부분의 직렬화 객체를 포함할 수 있다. 따라서 Parcelable, Serializable과 같이 클래스 형태(멤버 함수를 포함하지 않음)가 아니라 데이터 전달이 목적이라면 가장 편리한 클래스이다.만약 클래스 형태를 객체화한 데이터를 전달하려면 속도가 빠른 Parcelable을 이용하자.Intent 유형: 인테르트는 내부에 번들 객체를 가지기 때문에 Bundle의 장점을 모두 가진다.또한 앱과 액티비티 매니저, 패키지 매니저 등 시스템 서비스 간 약속된 의미 있는 정보를 포함할 수 있다.