2012-08-02 2 views
0

문자열의 arraylists를 포함하는 영구 직렬화 가능 객체를 저장하는 Android 응용 프로그램이 있습니다. 이 개체는 내부 메모리에 저장되며 앱이 시작될 때마다 복구됩니다. 그것은 잘 작동합니다 .... 문제는 내가 시장에서 애플 리케이션의 newwer 버전을 시작하고 사용자가 최신 버전을 다운로드하고 설치하면 저장된 객체가 제대로 복구되지 않고 객체의 4 개 arraylists가 비어있게 복구된다는 것입니다. . 그런 다음 사용자가 이전 버전의 앱에 저장된 데이터를 잃어 버렸습니다. 이것은 내가 해결해야하는 거대한 문제입니다.내 응용 프로그램의 새로운 시장 버전에서 저장된 (영구적 인) 직렬화 가능 객체를 올바르게 읽을 수 없습니다.

이 내 직렬화 객체입니다

public class SaveState implements Serializable{ 
    public ArrayList <String> fNumbers = new ArrayList<String>(); 
    public ArrayList <String> fNames = new ArrayList<String>(); 
    public ArrayList <String> favNumbers = new ArrayList<String>(); 
    public ArrayList <String> favNames= new ArrayList<String>(); 
    public static SaveState instance=new SaveState(); 
} 

그리고이 내가이 영속 객체를 저장하고 복구하는 데 사용하는 방법은 다음과 같습니다

public static void saveData(Context context){ 
     ObjectOutput out; 
     try {   
      File directory = context.getDir(STORE_DIRECTORY, Context.MODE_PRIVATE); //primero comprobamos si existe el directorio, y si no, lo creamos. 
      File outFile = new File(directory, "appSaveState.data"); 
      System.out.println("########## SAVING INTO: "+outFile.getAbsolutePath()); 
      out = new ObjectOutputStream(new FileOutputStream(outFile)); 
      out.writeObject(SaveState.instance); 
      out.close(); 
     } catch (Exception e) {e.printStackTrace();} 
    } 

    public static void loadData(Context context){ 
     ObjectInput in; 
     try { 
      File directory = context.getDir(STORE_DIRECTORY, Context.MODE_PRIVATE); //primero comprobamos si existe el directorio, y si no, lo creamos. 
      File inFile = new File(directory, "appSaveState.data"); 
      System.out.println("########## LOADING FROM: "+inFile.getAbsolutePath()); 
      in = new ObjectInputStream(new FileInputStream(inFile)); //intentamos cargar el fichero  
      SaveState.instance=(SaveState) in.readObject(); 
      in.close(); 
     } catch (Exception e) {e.printStackTrace();} 
    } 

이 코드는 잘 작동 기억을 경우의 버전 앱이 업데이트되지 않았습니다.

무엇이 잘못 되었나요? 이 데이터를 내 앱의 다른 안드로이드 마켓 버전간에 지속적으로 유지하려면 어떻게해야합니까?

감사

+0

저는이 문제에 대해 전문가가 아니지만 특정 상황에서 직렬화가 일치하지 않을 수 있다고 생각합니다. JSON 또는 XML과 같은 안정적인 것을 사용하면 안정적인 결과를 얻을 수 있습니다. 이것이 현재의 문제에 도움이되지 않는다는 점에 유감입니다. – Krylez

답변

0

내가 데이터를 자신을 직렬화 및 자바 객체 직렬화에 의존하지 않을 것입니다.

개체를 ObjectOutputStream에 쓰는 대신 데이터를 XML 문서로 변환하고 저장소에 파일을 쓸 수 있습니다. 어쨌든 모든 문자열이므로보기가 어렵지 않습니다. 그런 다음 XML을 처리 할 수있는 클래스를 사용하여 데이터를 읽고 쓸 수 있습니다. 이 경우 디스크에있는 데이터는 가지고있는 프로그램 버전에 관계없이 항상 읽을 수 있습니다.

Java 직렬화의 문제점은 리플렉션에 크게 의존한다는 것과 기본 클래스의 구현이 변경되면 사용자가 배치된다는 것입니다.

+0

데이터를 저장하는 다른 방법이 있다는 것을 알고 있지만이 방법으로 문제를 해결하는 방법을 배우고 싶습니다. 감사합니다 bytheway – Pableras84