Десериализация

  • 11
  • Недоступна
На вход подается поток, в который записан сериализованный объект класса A либо класса B. Десериализуйте объект в методе getOriginalObject так, чтобы в случае возникновения исключения было выведено сообщение на экран и возвращен null. Реализуйте интерфейс Serializable там, где необходимо.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (51)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Eugene20 уровень
13 апреля, 20:21
Создал поток для чтения из файла и убил семь попыток...:(
Николай22 уровень
24 марта, 11:39
В описании задачи: "... чтобы в случае возникновения исключения было выведено сообщение на экран и возвращен null." Там же, но в разделе требования: " ... должен возвращать null, если при попытке десериализации возникло исключение." Т.е. не требуется писать никаких сообщений, просто вернуть null
Радик26 уровень, Казань
18 февраля, 20:56
Делов-то, с 9 попытки
S3R3N1TY33 уровень, Санкт-Петербург
18 февраля, 18:14
Для теста привел классы к статическим и создал класс "C". Затем пытался десериализовать обьект класса С в методе getOriginalObject , что привело к исключению вида: java.lang.ClassCastException: Solution$C cannot be cast to Solution$A Добавил данное исключение и обработал, к тем catch, которые уже были при создании блока try. Но валидатор при проверке написал, что нужно перехватить Исключение- видимо общего типа. Итого: достаточно обработать один общий Exception.
Алексей Масис31 уровень, Новосибирск
20 февраля, 09:12
а зачем создавать класс которого нет в коде? Да и по условию задачи вроде как сказано На вход подается поток, в который записан сериализованный объект класса A либо класса B.
S3R3N1TY33 уровень, Санкт-Петербург
20 февраля, 09:32
Чтобы проверить работу программы: по условию Метод getOriginalObject должен возвращать null, если при попытке десериализации не был получен объект типа A. Я просто для себя сделал такой тест, чтобы проверить работу исключения. А ты как проверял, что написал в мейне, чтобы убедиться что выдает исключение ?
Алексей Масис31 уровень, Новосибирск
20 февраля, 09:37
так там наверное имелось ввиду, возвращать null если был получен объект типа B. А вообще с каждым лв условия все труднее понять)
Алексей Масис31 уровень, Новосибирск
20 февраля, 12:08
нуу правильно, но ведь чтобы вернуть null не обязательно ловить исключение)
S3R3N1TY33 уровень, Санкт-Петербург
20 февраля, 13:26
По заданию сказано так: "чтобы в случае возникновения исключения было выведено сообщение на экран и возвращен null." А ты через что делал- скинь код в личку. Спасибо.
Александр20 уровень, Казань
4 апреля, 07:54
Сначала не понял в чем дело: почему успешно кастится object и к A и к B - потом вспомнил про наследование. В итоге я получал класс объекта
String className = object.getClass().getSimpleName();
И если он не В - кидаю исключение
if (className.equals("B")) throw new Exception();
Хотя вот ниже покрасивей делали:
(!object.getClass().equals(A.class)
Даниил26 уровень
6 февраля, 12:16
Чем лучше пытаешься решить задачу, чем ближе к "непонятному описанию", тем больше времени и попыток тратишь. Решил бы с первого раза, так нет же, валидатору нужно более тупое решение где просто ловим одно верхнее исключение вместо нескольких более конкретных. Это я к тому что ловить нужно только Exception. А вывод сообщения, в данном случае, это походу просто printStackTrace. И того с 3 попытки только.
Юрий23 уровень, Москва
12 февраля, 11:37
Тоже самое.. решение правильное, но валидатор не принимает, ему нужно попроще
Loveandpepper28 уровень, Москва
29 января, 13:24
Протупил полчаса, пока не понял, что оказывается надо ловить не конкретные исключения, а ВСЕ исключения (просто Exception). Валидатор как всегда радует!
Николай Малинчик41 уровень, Санкт-Петербург
29 января, 21:09
та же фигня(
Oleg Fedoruk24 уровень
понедельник, 19:03
спасибо, потратил 4 попытки впустую )
Vadim Krant23 уровень, Москва
20 января, 21:55
Классная задача, самая долгая затычка была вспомнить как классы сравнивать. Я уже не помню когда писал в мэйн что-то, вроде накидал код, без дебага подсунул валидатору, на удивление заходит пока с первого раза. Судя по статистике это не часто бывает. Задача простая, сравнение примитивными методами через получение классов я сделал через instanceof, красиво, просто и лаконично )
Игорь22 уровень, Нижний Новгород
12 января, 02:08
В некоторых решениях ниже предлагается делать проверку на тип с помощью instanceof или просто без предварительных проверок приводить считанный объект в типу A и ловить исключения. На мой взгляд это не совсем соответствует условию задачи - "5. Метод getOriginalObject должен возвращать null, если при попытке десериализации не был получен объект типа A." У нас B является наследников A, значит приведение b к (A) пройдет без проблем, да и b instanceof A выдаст true. Чтобы удостоверится, что мы возвращаем объект только типа A (исключая наследников), я воспользовался такой конструкцией:
public A getOriginalObject(ObjectInputStream objectStream) {
        Object object;
        try {
            object = objectStream.readObject();
            if (!object.getClass().equals(A.class)) {
                return null;
            } else return (A) object;
        } catch (IOException | ClassNotFoundException e) {
            return null;
        }
}
Тогда и ClassCastException отлавливать не надо. Но валидатор все равно требует в catch поставить (Exception e). Видимо искусственно кидает какие-то другие возможные исключения. А так задачка заставила еще раз вспомнить приведение и сравнение типов.
maxboot41 уровень, Днепр
6 февраля, 17:37
А что мешает сделать наоборот?:
A a = (A) objectStream.readObject();
if (!(a instanceof B)) return a;
King41 уровень, Санкт-Петербург
29 октября 2018, 10:11
Почему надо ловить просто Exception? Чем ему не нравятся более конкретные исключения? И вообще, это стандартная практика? Так нужно делать всегда или только под эту задачу? Задача оставила много вопросов и ни одного ответа...
Pavlic Morozov (pashok09i)30 уровень, Екатеринбург
27 января, 18:08
плюсую, причем сначала, до того как сделал проверку на инстансеоф по последнему пункту проходило с конкретными исключениями
Алексей40 уровень
5 октября 2018, 09:37
InvalidObjectException, а на DeserializationException валидатор ругается, т.к. он из ненативного пакета. Пришлось обернуть широким Exception