#android #serialization #objectoutputstream #objectinputstream #object-serialization
#Android #сериализация #objectoutputstream #objectinputstream #объект-сериализация
Вопрос:
Я пытаюсь сохранить свой сериализованный объект, когда activity вызывает onDestroy(), но когда я пытаюсь записать свой объект с помощью ObjectOutputStream, выдается java.io.NotSerializableExeption .
Не могли бы вы мне помочь. Спасибо
Ответ №1:
Я столкнулся с той же проблемой и создал этот класс, чтобы помочь сериализации:
public class SerializableRect implements Serializable {
private static final long serialVersionUID = 1L;
private Rect mRect;
public SerializableRect(Rect rect) {
mRect = rect;
}
public Rect getRect() {
return mRect;
}
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
int left = mRect.left;
int top = mRect.top;
int right = mRect.right;
int bottom = mRect.bottom;
out.writeInt(left);
out.writeInt(top);
out.writeInt(right);
out.writeInt(bottom);
}
private void readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException {
int left = in.readInt();
int top = in.readInt();
int right = in.readInt();
int bottom = in.readInt();
mRect = new Rect(left, top, right, bottom);
}
}
Ответ №2:
Если ваша карта объектов содержит несериализуемый объект, виртуальная машина ищет конструктор без аргументов, чтобы создать объект со значениями по умолчанию и двигаться дальше. Он выдает это исключение, когда не может. Суть в том, что каждый объект, на который ссылается ваш объектный граф, должен либо:
- Реализует Serializable (и все его члены тоже), или
- Наследуется от базового класса, который реализует Serializable(и все члены следуют правилам), или
- Реализует Serializable, и все несериализуемые члены помечаются как Volatile, или
- Несериализуемые члены, не отмеченные таким образом, имеют конструктор по умолчанию без аргументов для использования при десериализации.
Вы не предоставляете достаточно подробностей, чтобы я мог идти дальше, но я все равно не могу написать это для вас? В общем, вы можете наследовать из несериализуемых классов или обернуть их и предоставить необходимую функциональность. До тех пор, пока каждый член соответствует перечисленным мной условиям, исключения не должны создаваться.
Ответ №3:
Вам необходимо убедиться, что класс реализует java.io.Serializable
интерфейс. Также рассмотрите возможность использования пакетов вместо этого и сохранения ваших данных onSaveInstanceState
. Подробнее о хранении данных см. В Этом разделе руководства по разработке.
Комментарии:
1. да, я реализую java.io.Serializable в своем классе GameField, мой класс GameField содержит файлы Rect bouds, и когда я сохраняю свой класс GameField, он выдает java.io.NotSerializableExeption, и я думаю, что это границы. мой вопрос в том, как сохранить мои границы? Спасибо
2. Хорошо, в этом случае вам нужно будет вручную сериализовать объект. Для этого вы можете переопределить методы
writeObject
andreadObject
.