| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Сериализация и передача объектов |
| Автор: Alar 20.7.2005, 11:12 | ||||||
| Следующий тестовый пример. Два приложения, одно создает класс и сериализует его в файл, другое читает. Хотелось бы, чтобы второе ничего не знало о реализации интерфейса IFoo и работало только через интерфейс. Вот тексты: Приложение №1. В classpath содержит второе приложение для доступа к IFoo
Приложение №2: IFoo.java:
Loader.java:
При загрузке получаю java.lang.ClassNotFoundException: bla.bla.bla.Serializator$Foo. В-общем-то понятно почему: Loader не может загрузить класс Foo. Но хотелось бы как-нибудь реализовать подобную схему. То есть загрузить объект и работать с ним только через интерфейс, а про класс ничего не знать. Куда рыть? :-) |
| Автор: anonymouse 20.7.2005, 11:21 | ||
|
| Автор: Alar 20.7.2005, 11:25 |
| anonymouse, нет не в этом дело. Так я уже пробовал (сначала класс Foo был вообще в отдельном файле). Впрочем как "для галочки" попробовал безымянным классом, через абстрактный класс (вместо интерфейса). |
| Автор: tux 20.7.2005, 11:34 |
| В любом случае класс должен лежать в Class-Path, и при вызове Serializator и при вызове Loader, информация о том какой именно это класс тоже записывается при сериализации. А вот упоминать сам класс в Loader совсем необязательно, достаточно интерфейса. |
| Автор: anonymouse 20.7.2005, 11:43 |
| У тебя вообше с нормаьлным классом без интерфейса работает ? |
| Автор: Alar 20.7.2005, 11:55 | ||||
Это-то понятно. Проблема как раз в том, что небходимо, чтобы класс не лежал в classpath.
Работает и с интерфейсом, если класс Foo затолкать в classpath. |
| Автор: tux 20.7.2005, 12:01 | ||
Так не получится, откуда JVM узнает инфу о классе? При сериализации байт-код не сохраняется. Единственное, что могу предложить - написать свой собственный мудреный класс-лоудер, который будет грузить класс не из Class-Path, а откуда-то из другого места, по ссылке из сети, например. |
| Автор: Alar 20.7.2005, 12:52 | ||||
а как это вообще делается? а можно ли сделать так:
... а другое приложение его считает? |
| Автор: batigoal 20.7.2005, 13:02 | ||||
Посмотри тут: http://java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/ClassLoader/help.html Ну и доку: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassLoader.html
А потом восстановить его через Class.forName()? Смелая мысль. Может, попробуешь? Интересно... |
| Автор: Alar 20.7.2005, 13:08 | ||||
Попробовал. Защита от извращенцев работает На попытку загрузить класс:
ЗЫ. за ссылки - спасибо, почитаю. |
| Автор: tux 20.7.2005, 13:12 | ||
| Вот здесь я выкладывал пример загрузчика классов: http://forum.vingrad.ru/index.php?showtopic=53371&hl=
Опять-таки ведь в поток запишется состояние объекта, а не байт-код класса. А вот найти в Class-Path нужный класс и записать в поток байт-код можно попробовать. Хотя я себе не представляю задачу, где это нужно. Неужели проще это реализовать, чем передать клиенту jar с нужным классом? |
| Автор: kashka 20.7.2005, 16:43 |
| Странно а у меня все работает. Hello, world!!! |
| Автор: Alar 21.7.2005, 06:30 | ||
Hello, kashka!!! Ты просто не выполнил(а) условия: нужно, чтобы первый проект видел второй (classpath), а второй НЕ видел первый. В этом смысл. Если второму добавить первый в classpath или вообще все спихать в один, то конечно все будет работать. По теме: похоже простыми способами проблема не решается. Спасибо всем ответившим. |
| Автор: tux 21.7.2005, 08:37 |
| To Alar В общем идея такая... Пусть сервер - это Serializator, клиент - Loader. Для того, чтобы в клиенте получить класс, которого нет в Class-Path можно реализовать следующее: на сервере:
|
| Автор: zone51 13.1.2008, 02:14 |
| Кстати вот у меня анаог проблема встала. Есть клиент и есть сервер. Сервер посылает клиенту обьект-мой класс. Причем с заранее установленными полями. И выскакивает такой же эксепшн что не найден класс. Прошу если кто решил эту проблему напишите или посоветуйте еще чтонить. Спасибо. |