역기술로 SharedPreferences에 Object 저장

소개



이번은 종교상의 이유나 일신상의 사정 등으로 외부 라이브러리를 이용하고 싶지 않은 사람을 위해서, 오브젝트를 SharedPreferences에 역기적으로 보존하는 방법을 설명해 갑니다.
덧붙여서 나는 사내의 OSS 이용 수속이 번거롭고 릴리스도 가깝다는 이유로부터 이번의 방법으로 실장하기로 했습니다(소성)

처음부터 이 기사를 부정하는 것을 쓰는 것도 그렇습니다만, 이 손의 정보를 검색하면 「 Gson 없는 경우 그쪽의 방법을 추천합니다.

관련 기사
Preference에 Object를 저장하면 설정 화면의 구축이 끝난다!
SharedPrefarence에서 원하는 유형의 값 저장

구현



제목에 역기술이 있지만 객체를 Base64로 인코딩하고 SharedPreferences에 putString하면됩니다.
인코딩과 디코드의 메소드를 만들면 저장, 읽기를 바로 할 수 있습니다.

이번에는 샘플로 사용자 정보를 입력, 저장하고, 로드 버튼을 누르면 저장된 정보가 읽혀지는 앱을 만들었습니다. (소스는 마지막에 링크를 붙여 넣었습니다)

UserInfo 클래스



이름(String), 연령(int), 성별(enum)로 각각 정보를 가집니다.
문자열로 변환하기 위해 클래스 정의시 implements Serializable합니다.

UserInfo.java
import java.io.Serializable;

/**
 * Created by masaibar on 2015/12/05.
 */
public class UserInfo implements Serializable {

    private String mName;
    private int mAge;
    private Sex mSex;

    public enum Sex {
        MALE,
        FEMALE
    }

    public UserInfo(String name, int age, Sex sex) {
        mName = name;
        mAge = age;
        mSex = sex;
    }

    public String getName() {
        return mName;
    }

    public int getAge() {
        return mAge;
    }

    public Sex getSex() {
        return mSex;
    }
}

변환 방법



UserInfo를 String으로 변환하는 메서드와 String에서 UserInfo로 되돌리는 메서드입니다.
putString 할 때는 toBase64를 씹어 문자열로 저장하고 반대로 getString 할 때는 문자열에 toUserInfo를 씹어 데이터를 가져옵니다.
public static String toBase64(UserInfo userInfo) {

    ByteArrayOutputStream byteArrayOutputStream = null;
    ObjectOutputStream objectOutputStream = null;

    try {
        byteArrayOutputStream = new ByteArrayOutputStream();
        objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(userInfo);

        byte[] bytes = byteArrayOutputStream.toByteArray();
        byte[] base64 = Base64.encode(bytes, Base64.NO_WRAP);

        return new String(base64);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (objectOutputStream != null) {
                objectOutputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            if (byteArrayOutputStream != null) {
                byteArrayOutputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return null;
}

public static UserInfo toUserInfo(String base64) {

    ByteArrayInputStream byteArrayInputStream = null;
    ObjectInputStream objectInputStream = null;

    byte[] bytes = Base64.decode(base64.getBytes(), Base64.NO_WRAP);

    try {
        byteArrayInputStream = new ByteArrayInputStream(bytes);
        objectInputStream = new ObjectInputStream(byteArrayInputStream);
        UserInfo userData = (UserInfo) objectInputStream.readObject();
        return userData;
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            if (objectInputStream != null) {
                objectInputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            if (byteArrayInputStream != null) {
                byteArrayInputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return null;
}

화면 이미지



이런 느낌이 듭니다.
이름, 연령을 입력하고 성별을 선택하고 Save를 눌러 SharedPreferences에 저장합니다.


일단 앱을 종료하고 다시 열거나 CLEAR 버튼을 눌러 입력을 쭉 추가한 다음 LOAD를 누르면 저장된 UserInfo에서 로드하여 표시합니다.


결론



이와 같이 오브젝트를 정의할 때에 implements Serializable 해 두고, Base64 로 변환하는 것으로 캐릭터 라인으로서 SharedPreferences 에 보존할 수 있었습니다.
최초의 설명에도 썼습니다만, OSS 이용에 대해서 아무것도 제약이 없으면 Gson 라이브러리를 사용한 구현이 좋다고 생각합니다, 변환 후의 문자열의 가독성도 높고 소스도 깔끔하기 때문에. . .

이번 소스는 아래와 같습니다.
htps : // 기주 b. 코 m / 마사이바 r / 사 ゔ 오 b 지 c c ぁ mp

좋은 웹페이지 즐겨찾기