2010-11-07 25 views
101

Giả sử tôi có một số lớp đơn giản và một khi nó được khởi tạo như một đối tượng tôi muốn có thể tuần tự hóa nội dung của nó vào một tệp và truy xuất nó bằng cách tải tệp đó vào một thời gian sau đó ... Tôi không chắc bắt đầu từ đâu ở đây, Tôi cần phải làm gì để sắp xếp hàng loạt đối tượng này vào một tệp?Làm cách nào để tuần tự hóa một đối tượng và lưu nó vào một tệp trong Android?

public class SimpleClass { 
    public string name; 
    public int id; 
    public void save() { 
     /* wtf do I do here? */ 
    } 
    public static SimpleClass load(String file) { 
     /* what about here? */ 
    } 
} 

Đây có lẽ là câu hỏi dễ nhất trên thế giới, vì đây là một nhiệm vụ thực sự đơn giản trong .NET, nhưng trong Android tôi khá mới nên tôi hoàn toàn mất.

Trả lời

217

tiết kiệm (w/o ngoại lệ xử lý mã):

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
ObjectOutputStream os = new ObjectOutputStream(fos); 
os.writeObject(this); 
os.close(); 
fos.close(); 

tải (w/o ngoại lệ xử lý mã):

FileInputStream fis = context.openFileInput(fileName); 
ObjectInputStream is = new ObjectInputStream(fis); 
SimpleClass simpleClass = (SimpleClass) is.readObject(); 
is.close(); 
fis.close(); 
+0

Rất hữu ích. Bạn có thể vui lòng giải thích cho dù chúng tôi phải serialize lớp để viết như là tập tin đối tượng. –

+4

Chức năng này được thêm vào lớp của bạn nếu bạn sử dụng giao diện Serializable. Nếu tất cả những gì bạn muốn là serialization đối tượng đơn giản, đó là những gì tôi sẽ sử dụng. Nó là cực kỳ dễ dàng để thực hiện quá. http://developer.android.com/reference/java/io/Serializable.html – mtmurdock

+5

+1, Đối với nhiều đối tượng tiết kiệm có thủ thuật cần thiết: http://stackoverflow.com/a/1195078/1321401 – Luten

30

Tôi đã thử này 2 lựa chọn (đọc/ghi) , với các đối tượng đơn giản, mảng các đối tượng (150 đối tượng), Bản đồ:

OPTION1:

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
ObjectOutputStream os = new ObjectOutputStream(fos); 
os.writeObject(this); 
os.close(); 

OPTION2:

SharedPreferences mPrefs=app.getSharedPreferences(app.getApplicationInfo().name, Context.MODE_PRIVATE); 
SharedPreferences.Editor ed=mPrefs.edit(); 
Gson gson = new Gson(); 
ed.putString("myObjectKey", gson.toJson(objectToSave)); 
ed.commit(); 

Lựa chọn 2 là hai lần nhanh hơn phương án 1

Tùy chọn 2 bất tiện là bạn phải làm cho mã cụ thể để đọc:

Gson gson = new Gson(); 
JsonParser parser=new JsonParser(); 
//object arr example 
JsonArray arr=parser.parse(mPrefs.getString("myArrKey", null)).getAsJsonArray(); 
events=new Event[arr.size()]; 
int i=0; 
for (JsonElement jsonElement : arr) 
    events[i++]=gson.fromJson(jsonElement, Event.class); 
//Object example 
pagination=gson.fromJson(parser.parse(jsonPagination).getAsJsonObject(), Pagination.class); 
4

Mã hoàn chỉnh có xử lý lỗi và đóng luồng tệp được thêm. Thêm nó vào lớp học của bạn mà bạn muốn để có thể serialize và deserialize. Trong trường hợp của tôi, tên lớp là CreateResumeForm. Bạn nên thay đổi nó thành tên lớp của riêng bạn. Giao diện AndroidSerializable không đủ để lưu đối tượng của bạn vào tệp, nó chỉ tạo luồng.

// Constant with a file name 
public static String fileName = "createResumeForm.ser"; 

// Serializes an object and saves it to a file 
public void saveToFile(Context context) { 
    try { 
     FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 
     objectOutputStream.writeObject(this); 
     objectOutputStream.close(); 
     fileOutputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 


// Creates an object by reading it from a file 
public static CreateResumeForm readFromFile(Context context) { 
    CreateResumeForm createResumeForm = null; 
    try { 
     FileInputStream fileInputStream = context.openFileInput(fileName); 
     ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 
     createResumeForm = (CreateResumeForm) objectInputStream.readObject(); 
     objectInputStream.close(); 
     fileInputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return createResumeForm; 
} 

Sử dụng nó như thế này trong bạn Activity:

form = CreateResumeForm.readFromFile(this); 
6

Tôi chỉ cần thực hiện một lớp học để xử lý này với Generics, vì vậy nó có thể được sử dụng với tất cả các loại đối tượng đó là serializable:

public class SerializableManager { 

    /** 
    * Saves a serializable object. 
    * 
    * @param context The application context. 
    * @param objectToSave The object to save. 
    * @param fileName The name of the file. 
    * @param <T> The type of the object. 
    */ 

    public static <T extends Serializable> void saveSerializable(Context context, T objectToSave, String fileName) { 
     try { 
      FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
      ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 

      objectOutputStream.writeObject(objectToSave); 

      objectOutputStream.close(); 
      fileOutputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Loads a serializable object. 
    * 
    * @param context The application context. 
    * @param fileName The filename. 
    * @param <T> The object type. 
    * 
    * @return the serializable object. 
    */ 

    public static<T extends Serializable> T readSerializable(Context context, String fileName) { 
     T objectToReturn = null; 

     try { 
      FileInputStream fileInputStream = context.openFileInput(fileName); 
      ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 
      objectToReturn = (T) objectInputStream.readObject(); 

      objectInputStream.close(); 
      fileInputStream.close(); 
     } catch (IOException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     return objectToReturn; 
    } 

    /** 
    * Removes a specified file. 
    * 
    * @param context The application context. 
    * @param filename The name of the file. 
    */ 

    public static void removeSerializable(Context context, String filename) { 
     context.deleteFile(filename); 
    } 

} 
Các vấn đề liên quan