마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

직렬화 한 ArrayList를 다시 불러오는 과정에서 오류가 발생합니다.(IOException)

0 추천

배열리스트 저장을 위해 직렬화를 사용하였습니다. 그런데 저장까지는 문제없이 실행되는데.

저장된 파일을 다시 불러오려니까 뭔지 모를 오류가 발생하는 것 같습니다. 

직렬화는 SaveData라는 객체를 저장합니다.

ArrayList<SaveData>     saveData = null;

저장은 리스트뷰를 클릭해서 save버튼을 누르면 몇가지 정보와 함께 savefile.sav로 저장되는 형식입니다.

클릭된 리스트뷰의 번호로 배열리스트의 순서를 지정해서(itemClicked 번호), 그자리에 SaveData 객체를 

add로 끼워넣습니다. 저장은 배열리스트 전체를 저장합니다.

saveBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Calendar c = Calendar.getInstance();  //현재날짜

        String date = c.get(Calendar.YEAR) + "/" + ((c.get(Calendar.MONTH))+1) +"/" + c.get(Calendar.DATE) + " 저장됨 ";

        SaveData new_saveData = new SaveData();

        new_saveData.setSaveOrder("Save " + itemClicked + "  \n"+ date);
        new_saveData.setSaveWord(words);
        new_saveData.setKeyNum(keyNum);
        new_saveData.setStageNum(stageNum);
        new_saveData.setEncodeScreenShot(encodeScreenShot);

        saveData.remove(itemClicked);
        saveData.add(itemClicked,new_saveData);


        ///본격직렬화 저장///

        String filePath = "/sdcard/savefile.sav";

        try{
            FileOutputStream fos = new FileOutputStream(filePath);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            
            oos.writeObject(saveData);
            oos.close();



        }catch(IOException e){
            e.printStackTrace();

        }

        Toast.makeText(getApplicationContext(),"정상적으로 완료되었습니다",Toast.LENGTH_SHORT);
        refresh();


    }


});

 

public ArrayList<SaveData> unSerialize() {

    try {
        FileInputStream fis = new FileInputStream("/sdcard/savefile.sav");
        BufferedInputStream bis = new BufferedInputStream(fis);
        ObjectInputStream ois = new ObjectInputStream(bis);

        ArrayList<SaveData> savedata = new ArrayList<SaveData>();


          savedata = (ArrayList<SaveData>) ois.readObject();

        return savedata;

    } catch (FileNotFoundException e) {
        e.printStackTrace();

    }catch(IOException e){
        e.printStackTrace();


    }catch (ClassNotFoundException e){
        e.printStackTrace();

    }
    Log.v("직렬화","savedata 리턴 실패");
     return null;
}

문제가 되는 부분입니다.

savedata = (ArrayList<SaveData>) ois.readObject();

이 부분에서 EOFException 에러가 발생하는데,  여기저기 찾아봤지만 이게 어떤 에러인지 찾기가 힘듭니다.

영어에 약해 영어로 된 사이트는 이해가 잘 안됩니다 ...

saveData = (ArrayList<SaveData>) unSerialize();

리스트뷰에 적용시키기 위해 saveData에 적용하는 부분입니다.

이렇게 하고 실행시키면,

 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.novel.aca.visualnovelproject, PID: 2674
                                                                                java.lang.RuntimeException: Unable to start activity ComponentInfo{com.novel.aca.visualnovelproject/com.novel.aca.visualnovelproject.SaveLoad}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
                                                                                                 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
                                                                                    at com.novel.aca.visualnovelproject.BaseAdapterEx.getCount(BaseAdapterEx.java:39)
                                                                                    at android.widget.ListView.setAdapter(ListView.java:508)
                                                                                    at com.novel.aca.visualnovelproject.SaveLoad.refresh(SaveLoad.java:67)
                                                                                    at com.novel.aca.visualnovelproject.SaveLoad.onCreate(SaveLoad.java:116)
                                                                                    at android.app.Activity.performCreate(Activity.java:6876)
     
01-12 17:46:04.470 2674-2674/com.novel.aca.visualnovelproject W/System.err: java.io.EOFException
01-12 17:46:04.470 2713-2713/? W/ResourcesManager: getTopLevelResources: /data/app/com.kakao.talk-1/base.apk / 1.0 running in com.samsung.android.game.gametools rsrc of package com.kakao.talk
01-12 17:46:04.470 2674-2674/com.novel.aca.visualnovelproject W/System.err:     at java.io.DataInputStream.readByte(DataInputStream.java:77)
     
 
E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.novel.aca.visualnovelproject, PID: 2674
                                                                                java.lang.RuntimeException: Unable to start activity ComponentInfo{com.novel.aca.visualnovelproject/com.novel.aca.visualnovelproject.SaveLoad}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
          
 
                                                                                         Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
                                                                                    at com.novel.aca.visualnovelproject.BaseAdapterEx.getCount(BaseAdapterEx.java:39)
                                                                                    at android.widget.ListView.setAdapter(ListView.java:508)
                                                                                    at com.novel.aca.visualnovelproject.SaveLoad.refresh(SaveLoad.java:67)
                                                                                    at com.novel.aca.visualnovelproject.SaveLoad.onCreate(SaveLoad.java:116)
                                                                                    at android.app.Activity.performCreate(Activity.java:6876)
                                                                                    

이런 예외가 발생합니다.

아마 예외가 발생함으로 인해 객체가 전달이 안되서 NullPointerException도 같이 발생하는 것 같은데

예외가 뜨는 연유를 모르겠습니다.

catch로는 IOException가 발생했다고 나옵니다.

 

읽어주셔서 감사합니다.

(글자 수 제한으로  예외와 에러 항목을 대부분 지웠습니다)

 

ACA (220 포인트) 님이 2017년 1월 12일 질문
ACA님이 2017년 1월 12일 수정

1개의 답변

0 추천
혹시 SaveData 클래스가 Serializable 을 상속 합니까?
Development Guy (70,570 포인트) 님이 2017년 1월 12일 답변
네. SaveData클래스는 Serializable을 구현하고 있습니다.

public class SaveData implements Serializable{

    private int keyNum;
    private int stageNum;
    private Bitmap screenShot; //세이브상황에서의 스크린샷 한장
    private String saveOrder; //세이브 슬롯 넘버
    private String saveWord; // 세이브 상황 시의 진행중이던 대사
    private byte[] encodeScreenShot;



    public void setKeyNum(int keyNum){

        this.keyNum = keyNum;

    }
    public void setStageNum(int stageNum){

        this.stageNum = stageNum;
    }

    public void setScreenShot(Bitmap screenShot) {this.screenShot = screenShot;}
    public void setSaveOrder(String saveOrder){
        this.saveOrder = saveOrder;
    }
    public void setSaveWord(String saveWord){
        this.saveWord = saveWord;
    }
    public void setEncodeScreenShot(byte[] encodeScreenShot){this.encodeScreenShot = encodeScreenShot;}


    public Bitmap getScreenShot(){
        return screenShot;
    }
    public String getSaveOrder(){
        return saveOrder;
    }
    public String getSaveWord(){
        return saveWord;
    }
    public byte[] getEncodeScreenShot() {return encodeScreenShot;}


}
Bitmap 이 Serializable이 아니군요.
Bitmap이 Serializable이 아니면 아예 읽는 과정에서 오류가 생기나요?
그냥 직렬화만 안 될줄 알고 뒀었는데..
감사합니다! 참고 많이해서 해결된 것 같습니다.
...