|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
grass : 144 Новичок
|
Мар 09, 2010 21:40 |
|
|
Приветствую =)
Вопрос наверное из серии ЧаВо , но заинтересовал... А именно:
Как узнать какой объект годится для сериализации, а какой нет?
Вот к примеру Image - не подходит для сериализации, но не ясно есть ли внутренний метод или что, чтобы заранее узнать можно ли сериализовать этот объект или нет?
Жду полезных коментариев |
|
|
|
 |
almagnit : 938 Модератор Откуда: Луганск
|
Мар 09, 2010 22:17 |
|
|
У сериализации как и любого не явного действия много подводных камней, лучше не усердствуйте.
К примеру класс сериализованного объекта со временем может измениться, а значит десериализация этого объекта в будущем будет ошибочна, это приводит к необходимости поддержки сериализованных объектов в новых версиях проекта.
Так что никаких внутренних методов нет, есть интерфейс, который в свою очередь также накладывает ограничение на сериализуемый класс посредством UID который если не указывать явно, в будущем будет изменяться вместе со структурой класса и если этого не знать, также могут возникнуть ошибки. |
|
|
|
 |
abihle : 320 Бывалый Откуда: Одесса
|
Мар 09, 2010 22:19 |
|
|
| Если мне не изменяет память, то такие классы должны реализовывать соответствующий интерфейс, методов в котором ни каких не отделено, он является лишь меткой. |
|
|
|
 |
Jean : 1992 JavaTalks Team Member Откуда: Санкт-Петербург
|
Мар 10, 2010 2:46 |
|
|
| grass писал(а): |
| Как узнать какой объект годится для сериализации, а какой нет? |
Я бы сказал, что вас интересует вопрос терминологии...
Сериализация - это преобразование объекта в набор байт для передачи куда-нибудь. Десериализация - обратно. Исходя из этого метод toString любого класса можно считать сериализацией.
Java имеет (неудачные) механизм для сериализации - о нем уже сказали выше. Также есть более удачная реализация, которая тоже входит в стандартный SDK - смотрите интерфейс Externalizable.
Никто не мешает вам реализовать что-то свое и более удобное... _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
grass : 144 Новичок
|
Мар 10, 2010 4:36 |
|
|
| almagnit писал(а): |
У сериализации как и любого не явного действия много подводных камней, лучше не усердствуйте.
Так что никаких внутренних методов нет, есть интерфейс, который в свою очередь также накладывает ограничение на сериализуемый класс посредством UID который если не указывать явно, в будущем будет изменяться вместе со структурой класса и если этого не знать, также могут возникнуть ошибки. |
Спасибо, но я имел ввиду, как узнать что класс годится к сериализаци заранее, но не читать доки к нему... Например если бы я сам писал класс для будущей возможности сериализировать его, то поместил бы в него метод под названием boolean isSerializable(){return true;} или что-то в этом роде. Ну это соц инженерия, а стандартно какие метки используются? |
|
|
|
 |
sx01 : 96 Новичок Откуда: Санкт-Петербург
|
Мар 10, 2010 16:15 |
|
|
| Класс, который может быть сериализован должен имплиментировать интерфейс Serializable |
|
|
|
 |
nazica : 1519 Администратор Откуда: Donetsk, UA
|
Мар 11, 2010 11:01 |
|
|
или Externalizable (тогда нужно реализовать вручную метод сериализации и метод десериализации). _________________ Software and cathedrals are much the same - first we build them, then we pray |
|
|
|
 |
abihle : 320 Бывалый Откуда: Одесса
|
Мар 12, 2010 15:36 |
|
|
| Цитата: |
| как узнать что класс годится к сериализаци заранее |
по-моему можно вот так:
object instanceof Serializable |
|
|
|
 |
grass : 144 Новичок
|
Мар 12, 2010 20:25 |
|
|
| abihle писал(а): |
| Цитата: |
| как узнать что класс годится к сериализаци заранее |
по-моему можно вот так:
object instanceof Serializable |
То есть чисто по схеме проверки экземпляра?  |
|
|
|
 |
grass : 144 Новичок
|
Мар 13, 2010 23:37 |
|
|
| Jean писал(а): |
| grass писал(а): |
| Как узнать какой объект годится для сериализации, а какой нет? |
Я бы сказал, что вас интересует вопрос терминологии...
Сериализация - это преобразование объекта в набор байт для передачи куда-нибудь. Десериализация - обратно. Исходя из этого метод toString любого класса можно считать сериализацией.
Java имеет (неудачные) механизм для сериализации - о нем уже сказали выше. Также есть более удачная реализация, которая тоже входит в стандартный SDK - смотрите интерфейс Externalizable.
Никто не мешает вам реализовать что-то свое и более удобное... |
Это довольно интересно насчет своей реализации эффекта сериализации. но я не совсем пойму тогда, как можно любой объект преобразовать в биты, чтобы потом помещать в поток? Есть уловки? |
|
|
|
 |
Jean : 1992 JavaTalks Team Member Откуда: Санкт-Петербург
|
Мар 14, 2010 1:35 |
|
|
Стандартный механизм сериализации предполагает имплементацию интерфейса Serializable. Для своей работы он использует два private метода readObоect и writeObject. Если вы хотите изменить логику сериализации и десериализации, то можете явно написать эти (обязательно private) методы со своей логикой и удивиться, что это будет работать. Конструктор объекта для создания нового экземпляра при этом не вызывается. Такая вот чача с вызовом приватных методов какими-то окольными путями...
Если хотите более понятного управления - используйте Externalizable. Идея та же, только есть понятные методы для реализации. Ну и наверняка туториалов в Сети вагон и маленькая тележка.
А можно просто реализовать сохранение полей класса по порядке в массив байт. Все строки преобразуются; дробные числа, целые числа преобразуются. Массив байт можно передать как угодно. Поскольку вы знаете в каком именно порядке сохраняли свои данные в этот массив байт, то не составит труда воспроизвести операцию в обратном порядке. К слову, именно таким образом и работает стандартный механизм. _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
grass : 144 Новичок
|
Мар 14, 2010 20:18 |
|
|
| Jean писал(а): |
А можно просто реализовать сохранение полей класса по порядке в массив байт. Все строки преобразуются; дробные числа, целые числа преобразуются. Массив байт можно передать как угодно. Поскольку вы знаете в каком именно порядке сохраняли свои данные в этот массив байт, то не составит труда воспроизвести операцию в обратном порядке. К слову, именно таким образом и работает стандартный механизм. |
то бишь просто реализовать readBytes() из класса ? Из серии PipedIO ?  |
|
|
|
 |
Jean : 1992 JavaTalks Team Member Откуда: Санкт-Петербург
|
Мар 14, 2010 23:01 |
|
|
Если вам нужно реализовать некий механизм, то какая разница каким именно образом он будет реализован? Стандартными средствами, каким-нибудь супер фреймворком, вашим велосипедом... пользователю, который будет работать с приложением глубоко фиолетово, как именно оно работает. _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
grass : 144 Новичок
|
Мар 15, 2010 6:10 |
|
|
| Jean писал(а): |
| Если вам нужно реализовать некий механизм, то какая разница каким именно образом он будет реализован? Стандартными средствами, каким-нибудь супер фреймворком, вашим велосипедом... пользователю, который будет работать с приложением глубоко фиолетово, как именно оно работает. |
Пару оптимальных ссылок не подкините по теме? А то мне попадаются "обрывки газеты"  |
|
|
|
 |
Jean : 1992 JavaTalks Team Member Откуда: Санкт-Петербург
|
Мар 15, 2010 10:44 |
|
|
Только книги. Я рекомендую Философию Java. _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
|
|
|