Сохранение моего сериализованного класса, в котором нет сериализованных объектов, таких как Rect

#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:

Если ваша карта объектов содержит несериализуемый объект, виртуальная машина ищет конструктор без аргументов, чтобы создать объект со значениями по умолчанию и двигаться дальше. Он выдает это исключение, когда не может. Суть в том, что каждый объект, на который ссылается ваш объектный граф, должен либо:

  1. Реализует Serializable (и все его члены тоже), или
  2. Наследуется от базового класса, который реализует Serializable(и все члены следуют правилам), или
  3. Реализует Serializable, и все несериализуемые члены помечаются как Volatile, или
  4. Несериализуемые члены, не отмеченные таким образом, имеют конструктор по умолчанию без аргументов для использования при десериализации.

Вы не предоставляете достаточно подробностей, чтобы я мог идти дальше, но я все равно не могу написать это для вас? В общем, вы можете наследовать из несериализуемых классов или обернуть их и предоставить необходимую функциональность. До тех пор, пока каждый член соответствует перечисленным мной условиям, исключения не должны создаваться.

Ответ №3:

Вам необходимо убедиться, что класс реализует java.io.Serializable интерфейс. Также рассмотрите возможность использования пакетов вместо этого и сохранения ваших данных onSaveInstanceState . Подробнее о хранении данных см. В Этом разделе руководства по разработке.

Комментарии:

1. да, я реализую java.io.Serializable в своем классе GameField, мой класс GameField содержит файлы Rect bouds, и когда я сохраняю свой класс GameField, он выдает java.io.NotSerializableExeption, и я думаю, что это границы. мой вопрос в том, как сохранить мои границы? Спасибо

2. Хорошо, в этом случае вам нужно будет вручную сериализовать объект. Для этого вы можете переопределить методы writeObject and readObject .