2010-12-28 14 views

Odpowiedz

22

przykład.

public class MyClass implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    public String title; 
    public String startTime; 
    public String endTime; 
    public String day; 

    public boolean classEnabled; 


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

    public boolean saveObject(MyClass obj) { 
     final File suspend_f=new File(SerializationTest.cacheDir, "test"); 

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

     try { 
      fos = new FileOutputStream(suspend_f); 
      oos = new ObjectOutputStream(fos); 
      oos.writeObject(obj); 
     } catch (Exception e) { 
      keep = false; 
     } finally { 
      try { 
       if (oos != null) oos.close(); 
       if (fos != null) fos.close(); 
       if (keep == false) suspend_f.delete(); 
     } catch (Exception e) { /* do nothing */ } 
     } 

     return keep; 
    } 

    public MyClass getObject(Context c) { 
     final File suspend_f=new File(SerializationTest.cacheDir, "test"); 

     MyClass simpleClass= null; 
     FileInputStream fis = null; 
     ObjectInputStream is = null; 

     try { 
      fis = new FileInputStream(suspend_f); 
      is = new ObjectInputStream(fis); 
      simpleClass = (MyClass) is.readObject(); 
     } catch(Exception e) { 
      String val= e.getMessage(); 
     } finally { 
      try { 
       if (fis != null) fis.close(); 
       if (is != null) is.close(); 
      } catch (Exception e) { } 
     } 

     return simpleClass; 
    } 

i dzwoni z działalności

if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) 
    cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"MyCustomObject"); 
else 
    cacheDir= getCacheDir(); 
if(!cacheDir.exists()) 
    cacheDir.mkdirs(); 

MyClass m = new MyClass("umer", "asif", true); 
boolean result = m.saveObject(m); 

if(result) 
    Toast.makeText(this, "Saved object", Toast.LENGTH_LONG).show(); 
else 
    Toast.makeText(this, "Error saving object", Toast.LENGTH_LONG).show(); 

MyClass m = new MyClass(); 
MyClass c = m.getObject(this); 

if(c!= null) 
    Toast.makeText(this, "Retrieved object", Toast.LENGTH_LONG).show(); 
else 
    Toast.makeText(this, "Error retrieving object", Toast.LENGTH_LONG).show(); 

nie zapomnij użyć uprawnienia WRITE_EXTERNAL_STORAGE w pliku manifestu.

+1

i nie używaj kontekstu, w przeciwnym razie zostanie zgłoszony wyjątek nonserializacyjny. – UMAR

+0

Skąd mogę uzyskać klasę SerializationTest? –

+0

SerializationTest jest tylko odnośnikiem do katalogu, którego używa. Będziesz chciał uzyskać to od Androida w zależności od swoich celów. – IcedDante

-1

Ten problem można rozwiązać za pomocą pojedynczej klasy here, w której można ustawić/uzyskać dowolny obiekt, np. ArrayList w dowolnym momencie. Jeśli korzystasz z usługi Android, to rozwiązanie nie jest odpowiednie. Być może rozwiązanie twojego problemu można znaleźć here.

+0

nie jest dla mnie pomocny. – UMAR

1

Ten problem nie jest specyficzny dla Androida. Chodzi mi o to, że jeśli wiesz, jak serializować dane za pośrednictwem java.io.Serializable lub masz niestandardowy format utrwalania, po prostu musisz wiedzieć, gdzie go przechowywać.

Można chwycić plik na urządzeniu lokalnym poprzez

FileOutputStream stream = null; 
try{ 
    stream = mContext.openFileOutput("name.data", Context.MODE_PRIVATE); 
    DataOutputStream dout = new DataOutputStream(stream); 
    dout.writeObject(myArrayList); 
    dout.flush(); 
    stream.getFD().sync(); 
catch(IOException e) { //Do something intelligent } 
finally { 
    stream.close(); 
} 

Będziesz musiał użyć openFileInput(), później do odczytu danych z powrotem.

Albo możesz pobrać Zewnętrzną pamięć masową. Jest to podobne, jednak musisz zagwarantować, że ono istnieje. Podobnie jak pamięć zewnętrzna jest podłączona, a nawet możliwa do zapisania. Ponieważ piszesz tutaj strukturę danych i zazwyczaj pamięć zewnętrzna jest do odczytu na całym świecie, nie sądzę, że jest to dobry pomysł na twoje zamierzone cele (po prostu od tego, co umieściłeś).

Jeśli twoje dane są uporządkowane i będą wielokrotnie sprawdzane, a ładowanie może być dość duże, rozważ użycie narzędzi SQL Lite, które są częścią systemu operacyjnego. Zakładam jednak, że tego nie potrzebujesz, ponieważ prosta lista to po prostu liniowe struktury, które prawdopodobnie można przeszukiwać w pliku (przy założeniu, że jest to mniej niż 1 MB danych :)

+0

, jeśli używasz kontekstu, wówczas serializowalny błąd throw notSerSerializable wyjątek, ponieważ kontekst nie jest możliwy do serializacji. tak pomysł jest taki sam, ale bez użycia kontekstu. dzięki. – UMAR

+0

Tak jak powiedziałem, zakładam, że miałeś obiekt do serializacji. Nie mówię serializuję kontekstu. Mówię serializuję zawartość listy, której nie opisałeś. Nigdy nie powinieneś nigdy utrzymywać kontekstu. –

Powiązane problemy