2010-12-09 3 views
14

사용자 지정 개체로 구성된 arraylist를 만들었습니다. 기본적으로 사용자는 클래스를 만들고 클래스가 생성 될 때마다 새로운 강의 (내 사용자 정의 객체)가 arraylist에 추가됩니다. 생성 된 arraylist를 저장해야 앱을 다시 시작하더라도 사용자의 클래스가 저장됩니다.사용자 정의 객체의 arraylist를 저장하려면 어떻게해야합니까?

제 생각에는 클래스를 직렬화 할 수 있어야합니다. 하지만 정확히 어떻게해야합니까? 그리고 나서 그것의 직렬화는 어떻게해야합니까?

public class Lecture{ 

public String title; 
public String startTime; 
public String endTime; 
public String day; 
public boolean classEnabled; 

public Lecture(String title, String startTime, String endTime, String day, boolean enable){ 
    this.title = title; 
    this.startTime = startTime; 
    this.endTime = endTime; 
    this.day = day; 
    this.classEnabled = enable; 
} 
//Getters and setters below 

답변

11

당신은 행운에있어 '를 멤버가 이미 serialzble 있습니다 그래서 당신의 첫 번째 단계는 강의 직렬화라고 말할 것입니다.

public class Lecture implements Serializable { 

    public String title; 
    public String startTime; 
    public String endTime; 
    public String day; 
    public boolean classEnabled; 

    public Lecture(String title, String startTime, String endTime, String day, boolean enable){ 
     this.title = title; 
     this.startTime = startTime; 
     this.endTime = endTime; 
     this.day = day; 
     this.classEnabled = enable; 
    } 

다음으로 직렬화에 필요하므로 기본 생성자를 만들어야합니다. 마지막으로 객체를 파일에 써야합니다. 나는 보통 다음과 같은 것을 사용한다. 캐시 디렉토리를 사용하지 않기 위해 게임 상태를 저장하는 것입니다.

private void saveState() { 
    final File cache_dir = this.getCacheDir(); 
    final File suspend_f = new File(cache_dir.getAbsoluteFile() + File.separator + SUSPEND_FILE); 

    FileOutputStream fos = null; 
    ObjectOutputStream oos = null; 
    boolean   keep = true; 

    try { 
     fos = new FileOutputStream(suspend_f); 
     oos = new ObjectOutputStream(fos); 

     oos.writeObject(this.gameState); 
    } 
    catch (Exception e) { 
     keep = false; 
     Log.e("MyAppName", "failed to suspend", e); 
    } 
    finally { 
     try { 
      if (oos != null) oos.close(); 
      if (fos != null) fos.close(); 
      if (keep == false) suspend_f.delete(); 
     } 
     catch (Exception e) { /* do nothing */ } 
    } 
} 

데이터를 다시 읽는 것은 쓰기와 상당히 대칭입니다. 그래서 나는이 대답을 남겼습니다. 또한 직렬화 된 객체에 대한 많은주의 사항이 있으므로 Google 검색을 수행하고 Java 직렬화에 대한 일반적인 내용을 읽어 보시기 바랍니다.

public class RegionList extends ArrayList<Region> {} // Region implements Serializeable 

내가 같은 코드를 사용하여 저장하려면

+0

설명하면서 마이너스는, 당신의 대답을 발견 검색 좀! – l0gg3r

13

내가 개발하고 있어요 날씨 앱에서 클래스를 사용 ... ...

FileOutputStream outStream = new FileOutputStream(Weather.WeatherDir + "/RegionList.dat"); 
ObjectOutputStream objectOutStream = new ObjectOutputStream(outStream); 
objectOutStream.writeInt(uk_weather_regions.size()); // Save size first 
for(Region r:uk_weather_regions) 
    objectOutStream.writeObject(r); 
objectOutStream.close(); 

참고 : 나는 지역을 작성하기 전에 개체의 경우 목록의 '크기'를 저장하기 위해 int를 작성합니다. 나는 다시 내가 이렇게 읽어

...

FileInputStream inStream = new FileInputStream(f); 
ObjectInputStream objectInStream = new ObjectInputStream(inStream); 
int count = objectInStream.readInt(); // Get the number of regions 
RegionList rl = new RegionList(); 
for (int c=0; c < count; c++) 
    rl.add((Region) objectInStream.readObject()); 
objectInStream.close(); 
관련 문제