В Java действительно ли возможно добавить сериализуемый интерфейс для классификации, который не имеет его во времени выполнения?

Существует класс, который я хочу сериализировать, и он реализует сериализуемый, но один из объектов, которые он содержит, не реализует сериализуемый.

Существует ли способ изменить класс во времени выполнения, чтобы заставить его реализовать сериализуемый интерфейс, таким образом, я могу сериализировать его? Я не могу изменить его во время компиляции, потому что это - сторонняя библиотека.

Возможно, я должен был бы использовать своего рода устройство записи байт-кода или что-то?

Править: Оба содержание класса и содержавшего класса находится в сторонней библиотеке, таким образом, я не думаю, что могу отметить что-то как переходный процесс. Содержание класса отмечено как сериализуемое, но это содержит объект, который не является.

Все хорошо с записью пользовательского метода сериализации для класса, не уверенного, как я сделал бы это, хотя, я должен буду использовать отражение для получения значений частных переменных?

6
задан Kyle 22 January 2010 в 00:53
поделиться

5 ответов

Чтение Javadoc для сериализации, я вижу:

классы, которые требуют специального обращения во время сериализации и процесс десериализации должен реализовать специальные методы с этими точными Подписи:

private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;
 private void readObjectNoData() 
     throws ObjectStreamException;

, которые вы могли бы использовать для вручную сериализовать неконтературные поля. Вы можете посмотреть на использование ASM, но кажется, что это трудно поверить, что это удостоверение для удовольствия.

5
ответ дан 10 December 2019 в 02:47
поделиться

поля могут быть пропущены с использованием модификатора модификатора . Дополнительные данные могут быть добавлены в поток, предоставив readObject и методы resignObject . Классы могут быть подклассаны, чтобы сделать их сериалом (хотя вам нужно будет управлять данные суперкласса) или использовать последовательный прокси (см. Эффективную Java).

3
ответ дан 10 December 2019 в 02:47
поделиться

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

0
ответ дан 10 December 2019 в 02:47
поделиться

Вы можете использовать java.lang.reflect.proxy, чтобы добавить интерфейс сериализуемого интерфейса для объектных экземпляров, по которым у вас нет контроля жизненного цикла (то есть не может подразделить их) и получить их сериал. Но тогда вы все равно не сможете прочитать их обратно без другого взлома (I.E. Представляем суррогатный класс).

Я бы порекомендовал искать альтернативу для сериализованного механизма Java в целом. Это в значительной степени сломано по дизайну несколькими способами.

0
ответ дан 10 December 2019 в 02:47
поделиться

Прежде всего, вы действительно надо это сделать? Может быть, класс в сторонней библиотеке не сериализуется по дизайну. Даже если это просто упущение, а не преднамеренное решение, достаточно легко написать пользовательский метод сериализации в классе помощника. Если вы имеют , чтобы сделать это, хотя (например, я должен был, для чего-то похожего). Взгляните на Javassist . Вы можете сделать что-то подобное:

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("mypackage.MyClass");
cc.addInterface(pool.get("java.io.Serializable"))

Редактировать: Вы можете использовать стороннюю сериализацию API, подобную , что вместо того, чтобы делать всю грязную работу самостоятельно.

1
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: