Parcel이란
Android에서 Parcel은 Java 객체를 마샬링 및 마샬링 해제하기 위한 고성능 메커니즘입니다.
객체를 바이트 스트림으로 직렬화하여 프로세스 경계를 넘어 전송할 수 있습니다.
또는 파일 또는 데이터베이스에 저장할 수 있습니다.
Android는 사용자 정의 객체를 Parcel로 직렬화하는 데 사용되는 Parcelable 인터페이스도 제공합니다.
Parcel 클래스는 기본 데이터 유형, 배열 및 기타 객체를 쓰고 읽을 수 있는 메서드를 제공합니다.
Parcelable 인터페이스를 구현하려면 개체의 상태를 소포에 쓰고 다시 읽는 코드를 작성해야 합니다.
다음은 Parcelable 인터페이스를 구현하는 클래스의 예입니다.
public class Person implements Parcelable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
protected Person(Parcel in) {
name = in.readString();
age = in.readInt();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
// getters and setters omitted for brevity
}
이 예제에서 Person 클래스는 Parcelable 인터페이스를 구현합니다.
Parcel을 매개변수로 사용하고 readString() 및 readInt() 메서드를 사용하여 소포에서 객체의 상태를 읽는 생성자가 있습니다.
Person 클래스에는 구획에서 Person 개체를 생성하는 정적 팩터리 개체인 CREATOR 필드도 있습니다.
createFromParcel() 메서드는 구획에서 새 Person 객체를 생성하기 위해 호출되고 newArray() 메서드는 지정된 크기의 Person 객체 배열을 생성하는 데 사용됩니다.
Person 클래스는 0을 반환하는 describeContents() 메서드와 writeString() 및 writeInt() 메서드를 사용하여 객체의 상태를 구획에 쓰는 writeToParcel() 메서드를 재정의합니다.
Parcel과 함께 Person 클래스를 사용하려면 새 Person 개체를 만들고 다음과 같이 소포에 쓸 수 있습니다.
Person person = new Person("John", 30);
Parcel parcel = Parcel.obtain();
person.writeToParcel(parcel, 0);
그리고 다음과 같이 소포에서 Person 개체를 다시 읽을 수 있습니다.
parcel.setDataPosition(0);
Person newPerson = Person.CREATOR.createFromParcel(parcel);
aidl 환경에서 사용자가 만든 class 를 보내고 싶다면 parcelable 을 implement 해야하는데, 해당하는 예시 글입니다
https://yeon-lee.tistory.com/189
[Android] Aidl 로 class 옮기기
Aidl 로 class 옮기기 크게 보내는 함수 .aidl 생성 보내는 함수 .java 를 parcelable 로 implement 전송하는 .aidl 에 임포트 및 in 추가 정도로 정리할 수 있다. CGMessage.aidl (보내고자 하는 클래스) 우선 해당하
yeon-lee.tistory.com
Marshalling 이란
마샬링은 Java 개체를 저장하거나 네트워크를 통해 전송할 수 있는 형식으로 변환하는 프로세스입니다.
위에서 언급한 parceling 전에 수행해야 하는 작업입니다.
다음을 포함하여 Java 객체를 마샬링하는 여러 가지 방법이 있습니다.
- 직렬화: Java는 java.io.Serializable 인터페이스를 사용하여 개체를 직렬화하기 위한 내장 지원을 제공합니다. 개체를 직렬화하려면 Serializable 인터페이스를 구현하고 ObjectOutputStream에 개체를 쓰기만 하면 됩니다. 그런 다음 직렬화된 개체는 바이트 스트림으로 저장 또는 전송될 수 있으며 ObjectInputStream을 사용하여 반대쪽 끝에서 역직렬화될 수 있습니다.
- XML 마샬링: XML은 서로 다른 시스템 간에 데이터를 교환하는 데 널리 사용되는 형식입니다. Java는 javax.xml.bind 패키지를 사용하여 객체를 XML로 마샬링하는 지원을 제공합니다. 이 패키지는 개체의 XML 표현을 사용자 지정하는 데 사용할 수 있는 주석을 제공합니다.
- JSON 마샬링: JSON은 서로 다른 시스템 간에 데이터를 교환하는 데 널리 사용되는 또 다른 형식입니다. Java는 Jackson 또는 Gson과 같은 라이브러리를 사용하여 객체를 JSON으로 마샬링하는 지원을 제공합니다. 이러한 라이브러리는 리플렉션을 사용하여 개체를 JSON 문자열로 변환한 다음 네트워크를 통해 전송하거나 파일에 저장할 수 있습니다.
- 사용자 지정 마샬링: XML 또는 JSON으로 쉽게 직렬화할 수 없는 복잡한 개체의 경우 사용자 지정 마샬링을 사용할 수 있습니다. 여기에는 객체를 저장하거나 네트워크를 통해 전송할 수 있는 형식으로 변환하는 코드 작성이 포함됩니다. 사용자 지정 마샬링을 사용하여 직렬화된 데이터의 크기를 최적화하거나 데이터를 다른 프로그래밍 언어 또는 시스템에서 읽을 수 있는 형식으로 변환할 수 있습니다.
다음은 내장 직렬화 메커니즘을 사용하여 Java 객체를 직렬화하는 예입니다.
public class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
// serialize the object to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(new Person("John", 30));
byte[] bytes = bos.toByteArray();
// deserialize the object from the byte array
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream in = new ObjectInputStream(bis);
Person person = (Person) in.readObject();
'개발 > Android Studio' 카테고리의 다른 글
[Android Studio] Context, getApplicationContext 란 (0) | 2023.03.13 |
---|---|
[Android Studio] IPC, RPC 차이점 (0) | 2023.03.13 |
[Android Studio] Service 란, Service 생명주기 (0) | 2023.03.03 |
[Android Studio] Activity란, Activity생명주기 (0) | 2023.03.03 |
[Android Studio] largeheap true 란 memory 관리법 (0) | 2023.02.24 |