Интерфейсов недостаточно для того, чтобы объект позади них работал? - PullRequest
1 голос
/ 14 марта 2011

У меня есть интерфейс MigrateScenario с его методами. У меня также есть его реализация MigrateScenarioImpl. Экземпляр MigrateScenarioImpl сериализуется, а затем передается в виде байта [] в какой-либо веб-сервис. На сервисной стороне, когда я пытаюсь сделать это:

Object obj = (new ObjectInputStream(digitalObject.getContent().getInputStream())).readObject();
MigrateScenario mgrScenario = (MigrateScenario) obj;

и я получаю, что класс MigrateScenarioImpl отсутствует в пути к классам. Переменная obj содержит этот объект, и интерфейс должен вслепую запрашивать соответствующие методы, поскольку объект «сам знает», как их выполнять. Однако, когда я добавляю MigrateScenarioImpl в classpath, все работает нормально. Я что-то здесь упускаю? Буду признателен за любую помощь, спасибо!

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Знание только интерфейса не помогает JVM знать, что делать.Нужно Impl, чтобы знать, что на самом деле делать, а не только какие методы доступны.

1 голос
/ 14 марта 2011

Вы не можете десериализовать класс без того, чтобы этот класс был известен загрузчику классов (например, находясь в пути к классам). Код для самого класса не сериализован, ожидается, что он будет известен на другом конце.

1 голос
/ 14 марта 2011

Когда вы десериализуете объект, Java необходимо создать экземпляр и инициализировать в экземпляре класса.Интерфейсы не могут быть созданы, поэтому Java должна создавать экземпляр класса реализации.Сериализация класса содержит данные экземпляра (значения переменных, не являющихся временными переменными экземпляра), а не код реализованных методов, поэтому для интерфейса нет методов, на которые может указывать интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...