2013-09-02 4 views
3

У меня проблема с сохранением моего arraylist. Я хочу, чтобы спасти мою ArrayList, когда приложение уничтожить или изменить намерение или изменить ориентацию:Сохранение данных массива

public class AuditContainer implements Serializable { 
    private Paint mPaint; 
    private Path mPath; 
    private int x,y; 
    private String text; 
    boolean is_text; 

Сначала я попытался сохранения в файле, но класс Paint не Сериализуемый класс. Во-вторых, я пытаюсь использовать onSaveInstanceState (Bundle outState)/onRestoreInstanceState (Bundle savedInstanceState), но я не смог сохранить Arraylist , а третий я попробую с базой данных, но нет никаких типов Paint, Path ... Если у кого-то есть предложение для меня, Я буду очень счастлив.

ответ

3

У вас есть три варианта:

A. Изменить Paint для реализации Serializable.
B. Отметьте поле не для сериализации, используя ключевое слово transient:

private transient Paint mPaint; 

C. Напишите свою собственное Serializable оболочки для краски, которая держит сериализуемые копии ключевых полей, и delegates функциональности частной транзиторной Paint, и может повторно инициализировать экземпляр Paint после десериализации.

+0

Проблема в том, что я использую первый вариант, у меня есть проблема и исключение java trow java.io.WriteAbortedException: чтение исключения; java.io.NotSerializableException: android.graphics.Paint. если я использую второй вариант paint и path class null :( – Papi

+0

Проверьте новый третий вариант – Bohemian

+0

Проблема в java не имеет делегирования http://stackoverflow.com/questions/44912/java-delegates – Papi

3

Если Paint и Path являются классами под вашим контролем, а затем сделайте их сериализуемыми. Если они не являются полностью релевантными или вы можете определить их извне, когда вы читаете объект назад, то вы можете сделать поля transient.

1

Чтобы опустить сериализации несериализуемых полей, помечать их как transient:

public class AuditContainer implements Serializable { 
    private transient Paint mPaint; 
    private transient Path mPath; 
    private int x,y; 
    private String text; 
    boolean is_text; 
} 

Вероятно, есть данные о Paint mPaint и Path mPath полей, которые вы все еще хотите сохранить сериализацию и получить на десериализации процессов, для этого вы должны реализовать writeObject и readObject методы:

private void writeObject(ObjectOutputStream out) 
    throws IOException { 
    //default serialization of the object 
    out.defaultWriteObject(); 
    //start manual serialization 
    out.writeInt(mPaint.getX()); 
    out.writeInt(mPaint.getY()); 
    out.writeObject(mPath.getPath()); 
} 

private void readObject(ObjectInputStream in) 
    throws IOException { 
    //default serialization of the object 
    in.defaultReadObject(); 
    //start manual deserialization 
    int x = in.readInt(); 
    int y = in.readInt(); 
    String path = (String)in.readObject(); 
    //initialize your fields... 
    //note: this code maybe won't work, you should adapt it to your needs 
    mPaint = new Paint(x, y); 
    mPath = new Path(path); 
} 
1

вы можете использовать третью сторону, как XStream.It позволяет использовать, чтобы сохранить объект в XML и ему не нужно, чтобы объект был Serializable. У нас была подобная проблема в нашей компании (класс, который нельзя изменить и должен быть сохранен), и XStream помог нам. Пожалуйста, смотрите: http://x-stream.github.io/tutorial.html для простого руководства.

Смежные вопросы