본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-03-05 안드로이드 스튜디오 (직렬화)

반응형

직렬화

직렬화의 종류

primitive 타입 

boolean , byte, short, int ,long, float, double ,string 등과 같이 가공되지 않은 순수한 자료형을 말한다 

그림 참조 

메모리에 올라갈때 위처럼 각각 할당이 아닌 한줄로 쭉 들어가는형태로 직렬화임 

프리미티브 타입도 그래서 직렬화 임!! 

 

Serializable 클래스 직렬화 하기 

Serializable 객체를 상속하여 준다

객체단위를 보낼때 사용한다 고유의 아이디 값 ( 마커인터페이스) 으로 설정하여 사용한다  

 

메인 클래스 ( 인텐트로 보내주는 곳 ) 

 Intent intent = new Intent();  //명시적 인텐트

                Person person = new Person("Twice", 28);
                Person person2 = new Person("BlackPink", 25);
                     
                intent.putExtra("Person" , person);
                intent.putExtra("Person2" , person2);

펄슨객체를 만들어주고 생성자에 값을 넣어준다 그리고 나서 그 객체를 인텐트에 담아주었다
하지만 이렇게 보내게 되면 상대방 입장에서는 그 클래스가 무엇인지 모르기 때문에 상대방에게도
내 패키지명과 클래스명이 같은 패키지와 클래스를 만들어주어야 한다 그때마다 
변하는 동적인 변수는 IPC통해 넘겨주고 변하지않는 정적클래스 파일들은 직접전달해 주어야 한다

 

객체생성된 보내줄 클래스 ( 상대클래스에 만들어줘야함 ) 

ackage com.example.chap07;

import java.io.Serializable;

// 클래스를 보내줄려면 보내줄려하는 클래스를 implements Serializable 해주어야 한다
public class Person implements Serializable {
    /*고유의 아이디값을 가져야하는데 이건 변동없이 무조건 이렇게 작성해야된다
    * 여기서 작성한 고유의 아디값은 내가 직접전달해준 아이디값과 똑같아야 하며
    * 아이디 값으 변한다면 내가 보내준 그곳에 아이디값도 변경해주어야 한다 */
    private static final long serialVersionUTD = 10000000L;

    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

받을 패키지에 보낼 패키지이름과 클래스이름 같은 클래스를 하나 만들어 준다 <복사 붙여넣기> 

위 그림처럼 같은 패키지속에 보낼패키지와 클래스 이름을 가진 똑같은 클래스를 만들어준다 .

(노랑색 아님... ㅋ another 와 chap7 이다 헷갈리지마 ㅋㅋ )

자 그럼 만들어준 패키지를 어떻게 풀어줄까??  코드표 참조 

    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);

        
        //일단은 인텐트로 택배 받아와 준다
        Intent intent = getIntent();
         이제 받은것을 키값으로 풀어줘야하는데 풀기전에 명시적 형변환 해주어야 함
           풀때 메소드는 getSerializableExtra 이다
        Person person = (Person)intent.getSerializableExtra("Person"); 
        Person person2 = (Person)intent.getSerializableExtra("Person2");
          
        
        textView.setText("이름 : "+person.getName()+", 나이 : "+person.getAge());
        //textView.append 전 내용에 이어서 작성해주는 메소드
        textView.append("\n 이름 : "+person2.getName()+", "+person2.getAge());
    }
}

이렇게 받아온 클래스를 풀어주는데 꼭 명시적 형변환을 해주어야 한다!!

 

parcel  IPC전용 데이터로 사용하기 

제공하는 함수

객체를 생성하고 ( Parcel parcel = Parcel.obtain() ; 꼭이렇게 생성 )  

위에서 재공하는 함수로 보내준다 ( parcel.writeint(10) , parcel.writeString("아옳옳")  

parcel.setDataPosition(0); 메소드로 현재위치를 변경해주고 사용하면되는데 

주의사항 반드시 보낸 순서를 지켜야 한다 순서가 틀릴시 오류가 발생한다 

그래서 단독으로 Parcel 사용보다는 parcelable을 통하여 사용한다

 

parcelable

1. parcelable 클래스 구현 

 

2. parcelable 클래스 파일 송신 측 앱에 배포해야 한다. 

송신측 함수와 수신측 함수를 작성해주어야한다 

(writeToParcel 과 createFromParcel ) 

 

3. 구현클래스가 변경 되었다면 다시 송신측 앱에 수정parcelable 클래스를 공유해야한다

펄슨 2 로 했는데 내일 한번더 설명듣고 이해하자 ... 넘나 어려운것 

bundle

parcelable로 프리미티브 타입 몇개만 보낼때는 너무 불편하기떄문에 사용하는것이 번들이다 .

인텐트가 번들을 포함하고 있어서 보통 인텐트를 많이 사용함 

사용법은 인텐트랑 거의 동일하며 put .get을 붙여 사용한다 

 

Intent 

이전에 했었던 것들을 참조하면 되어서 이것에 대해서는 따로 설명 안함 

 

 

 

 

 

반응형