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

  • 11
  • Недоступна
На вход подается поток, в который записан сериализованный объект класса A либо класса B. Десериализуйте объект в методе getOriginalObject так, чтобы в случае возникновения исключения было выведено сообщение на экран и возвращен null. Реализуйте интерфейс Serializable там, где необходимо.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (40)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Даниил23 уровень
6 февраля, 12:16
Чем лучше пытаешься решить задачу, чем ближе к "непонятному описанию", тем больше времени и попыток тратишь. Решил бы с первого раза, так нет же, валидатору нужно более тупое решение где просто ловим одно верхнее исключение вместо нескольких более конкретных. Это я к тому что ловить нужно только Exception. А вывод сообщения, в данном случае, это походу просто printStackTrace. И того с 3 попытки только.
Юрий22 уровень, Москва
вторник, 11:37
Тоже самое.. решение правильное, но валидатор не принимает, ему нужно попроще
Loveandpepper22 уровень, Москва
29 января, 13:24
Протупил полчаса, пока не понял, что оказывается надо ловить не конкретные исключения, а ВСЕ исключения (просто Exception). Валидатор как всегда радует!
Николай Малинчик33 уровень, Санкт-Петербург
29 января, 21:09
та же фигня(
Vadim Krant22 уровень, Москва
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). Видимо искусственно кидает какие-то другие возможные исключения. А так задачка заставила еще раз вспомнить приведение и сравнение типов.
maxboot25 уровень, Днепр
6 февраля, 17:37
А что мешает сделать наоборот?:
A a = (A) objectStream.readObject();
if (!(a instanceof B)) return a;
King35 уровень, Санкт-Петербург
29 октября 2018, 10:11
Почему надо ловить просто Exception? Чем ему не нравятся более конкретные исключения? И вообще, это стандартная практика? Так нужно делать всегда или только под эту задачу? Задача оставила много вопросов и ни одного ответа...
Pavlic Morozov (pashok09i)24 уровень, Екатеринбург
27 января, 18:08
плюсую, причем сначала, до того как сделал проверку на инстансеоф по последнему пункту проходило с конкретными исключениями
Алексей40 уровень
5 октября 2018, 09:37
InvalidObjectException, а на DeserializationException валидатор ругается, т.к. он из ненативного пакета. Пришлось обернуть широким Exception
NazFarr27 уровень
7 сентября 2018, 13:42
Вы решили задачу лучше, чем 77% учеников Вам удалось ее решить с 1 попытки точно javarush меня садомазой сделал. уже привык к задачам, которые греют мозг,... не проходят,... ругаются на это, на другое, на третье... и после двух суток валидатор соизволяет принят решение. с первой попытки =разочарование (ClassCastException)
George28 уровень, Санкт-Петербург
2 сентября 2018, 13:01
Что не говори , Бобров - сволочь, но материал усваивать помогает.
Andry Max35 уровень, Минск
12 августа 2018, 22:00
сразу ловил все исключения и как итог с первой попытки, хотя тоже считаю что это такое себе
Ярослав35 уровень
1 июля 2018, 10:48
Эх, тоже попался на исключениях. Оказывается, нужно было ловить что-то отличное от IOException и ClassNotFoundException.