Существует класс, который я хочу сериализировать, и он реализует сериализуемый, но один из объектов, которые он содержит, не реализует сериализуемый.
Существует ли способ изменить класс во времени выполнения, чтобы заставить его реализовать сериализуемый интерфейс, таким образом, я могу сериализировать его? Я не могу изменить его во время компиляции, потому что это - сторонняя библиотека.
Возможно, я должен был бы использовать своего рода устройство записи байт-кода или что-то?
Править: Оба содержание класса и содержавшего класса находится в сторонней библиотеке, таким образом, я не думаю, что могу отметить что-то как переходный процесс. Содержание класса отмечено как сериализуемое, но это содержит объект, который не является.
Все хорошо с записью пользовательского метода сериализации для класса, не уверенного, как я сделал бы это, хотя, я должен буду использовать отражение для получения значений частных переменных?
Чтение 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, но кажется, что это трудно поверить, что это удостоверение для удовольствия.
поля могут быть пропущены с использованием модификатора модификатора
. Дополнительные данные могут быть добавлены в поток, предоставив readObject
и методы resignObject
. Классы могут быть подклассаны, чтобы сделать их сериалом (хотя вам нужно будет управлять данные суперкласса) или использовать последовательный прокси (см. Эффективную Java).
Если класс не помечен как сериализен, который может иметь веские причины (принять соединения в базе данных в качестве примера). Поэтому в первую очередь сделайте себя ясно, если вам действительно нужно также сериализировать этот объект. Если вам просто нужно сериализировать окружающий объект, вы можете рассмотреть маркировку содержащегося объекта в качестве преходящего.
Вы можете использовать java.lang.reflect.proxy, чтобы добавить интерфейс сериализуемого интерфейса для объектных экземпляров, по которым у вас нет контроля жизненного цикла (то есть не может подразделить их) и получить их сериал. Но тогда вы все равно не сможете прочитать их обратно без другого взлома (I.E. Представляем суррогатный класс).
Я бы порекомендовал искать альтернативу для сериализованного механизма Java в целом. Это в значительной степени сломано по дизайну несколькими способами.
Прежде всего, вы действительно надо это сделать? Может быть, класс в сторонней библиотеке не сериализуется по дизайну. Даже если это просто упущение, а не преднамеренное решение, достаточно легко написать пользовательский метод сериализации в классе помощника. Если вы имеют , чтобы сделать это, хотя (например, я должен был, для чего-то похожего). Взгляните на Javassist . Вы можете сделать что-то подобное:
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("mypackage.MyClass");
cc.addInterface(pool.get("java.io.Serializable"))
Редактировать: Вы можете использовать стороннюю сериализацию API, подобную , что вместо того, чтобы делать всю грязную работу самостоятельно.