Почему ObjectOutputStream.writeObject () генерирует IOException? - PullRequest
1 голос
/ 06 декабря 2011

В настоящее время я работаю над приложением для Android, которое автоматически изменяет состояние телефона в зависимости от определенного события, например уровня заряда батареи.У меня есть класс Profile, который имеет 3 основных параметра, имена, Event и State (Event и State - это 2 других пользовательских класса)

В моем классе ProfileEdit есть различные компоненты, такие как EditText и Spinner, для настройки пользователями.Профиль.Мне нужен доступ к ArrayList типа Profile в классе ListActivity, который отображает каждый профиль, и мой класс ProfileEdit, который получает текущий ArrayList и добавляет новый профиль, или обновляет его.

Идея, которую я должен был сделать, этоСначала нужно было использовать ObjectOutputStream для записи моего ArrayList на SD-карту телефона, затем он может быть получен любым классом, который в этом нуждается.Однако мои попытки сделать это до сих пор просто заканчиваются тем, что я генерирую IOException.Мой код выглядит следующим образом:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/sdcard/profile.prof"));
oos.writeObject(profiles);
oos.flush();
oos.close();

Объект с профилями - это мой ArrayList для записи в файл.Я не могу понять, почему это исключение.Я попытался изменить объект на строку, вызвав writeObject ("Hello");и это больше не выдает исключение, поэтому я могу только предположить, что это проблема с ArrayList.У меня сложилось впечатление, что класс ArrayList реализует сериализуемый, а мой класс Profile также реализует сериализуемый, хотя он делает то же самое без.

В качестве альтернативы, если есть лучший способ, я могу предоставить как свой ProfileList (ListActivity), так иКлассы ProfileEdit обращаются к тому же ArrayList, тогда, пожалуйста, дайте мне знать.

Редактировать: Вот трассировка стека IO Exceptions: (Строка 114 класса ProfileEdit - строка writeObject ())

EZSettings(14788): IO Exception
EZSettings(14788): java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535)
EZSettings(14788): java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
EZSettings(14788): java.util.ArrayList.writeObject(ArrayList.java:651)
EZSettings(14788): java.lang.reflect.Method.invokeNative(Native Method)
EZSettings(14788): java.lang.reflect.Method.invoke(Method.java:507)
EZSettings(14788): java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1219)
EZSettings(14788): java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1575)
EZSettings(14788): java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
EZSettings(14788): com.ezstatechanger.ProfileEdit.saveState(ProfileEdit.java:114)
EZSettings(14788): com.ezstatechanger.ProfileEdit.access$0(ProfileEdit.java:80)
EZSettings(14788): com.ezstatechanger.ProfileEdit$1.onClick(ProfileEdit.java:72)
EZSettings(14788): android.view.View.performClick(View.java:2538)
EZSettings(14788): android.view.View$PerformClick.run(View.java:9152)
EZSettings(14788): android.os.Handler.handleCallback(Handler.java:587)
EZSettings(14788): android.os.Handler.dispatchMessage(Handler.java:92)
EZSettings(14788): android.os.Looper.loop(Looper.java:123)
EZSettings(14788): android.app.ActivityThread.main(ActivityThread.java:3691)
EZSettings(14788): java.lang.reflect.Method.invokeNative(Native Method)
EZSettings(14788): java.lang.reflect.Method.invoke(Method.java:507)
EZSettings(14788): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
EZSettings(14788): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
EZSettings(14788): dalvik.system.NativeStart.main(Native Method)

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

Все ваши объекты и все их поля должны быть сериализуемыми, иначе они не могут быть сериализованы. Другим источником исключения ввода-вывода может быть отсутствие разрешения на запись на SD-карту. (нужны ли кому-либо, кроме вашего приложения, эти данные? если нет, то они относятся к областям предоставления услуг.)

Сериализация данных конфигурации удобна, но может быть плохой идеей - если ваша подпись объекта изменится, данные будут нечитаемыми. Лучшим решением было бы объединить объекты в JSON и сохраните этот файл (Бесстыдная самореклама на: https://github.com/ko5tik/jsonserializer)

0 голосов
/ 07 декабря 2011

Хотя Константин Приблуда определил лучшее решение для того, что мне нужно было сделать, этот вопрос был решен.

Оказалось, я тупо упустил из виду тот факт, что мои классы Event и State не реализовали Serializable.Любые поля в классе Serializable также должны быть Serializable, в противном случае генерируется исключение ввода-вывода.

...