Можете ли вы сделать объект сериализуемым во время выполнения? - PullRequest
8 голосов
/ 07 сентября 2010

Как и в заголовке, есть ли способ проверить, сериализуем ли объект, и если нет, сделать это во время выполнения?

Ответы [ 6 ]

11 голосов
/ 07 сентября 2010

Короткий ответ - нет.

Более длинный ответ - да, с использованием манипуляций с байт-кодом, например с asm.Но вы должны действительно подумать, нужно ли это.Сериализация - это серьезный вопрос (в Effective Java есть целая глава о сериализации)

Кстати, есть альтернативы двоичной сериализации, которые не требуют реализации объекта Serializble (как указал Джейкоб в комментариях):

  • XML - java.beans.XMLEncoder.encode(..) - это xml-версия ObjectOutputStream
  • JSON - фреймворки, подобные Jacskon, Gson, позволяют сериализовать объект одной строкой.
1 голос
/ 26 апреля 2012

Если кому-то действительно очень нужно манипулировать байт-кодом во время выполнения. С библиотекой Javassist можно сделать это:

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("mypackage.MyClass");
cc.addInterface(pool.get("java.io.Serializable"))
1 голос
/ 07 сентября 2010

Как уже говорили другие ... Краткий ответ - нет.

Вы можете абсолютно точно добавить интерфейс к любому старому объекту во время выполнения, используя прокси-объекты, как описано в http://download.oracle.com/javase/6/docs/technotes/guides/reflection/proxy.html.Это включает в себя также java.io.Serializable.Однако, чтобы прокси-объект был полезен, он должен поддерживать внутреннюю ссылку на исходный объект, который в вашем случае не реализует Serializable.Единственный способ сериализации прокси-объекта - сделать внутреннюю ссылку на исходный объект временным полем, и это не принесет вам никакой пользы.

Далее, после изучения ваших комментариев, похоже, что сериализация в java определенно не то, что вам нужно, и вы действительно просто хотите сериализовать в какой-либо формат строки.Другие предлагали различные решения, но IMO, если вам нужно наименьшее количество шума, используйте XStream: http://x -stream.github.io / tutorial.html .

0 голосов
/ 07 сентября 2010

Проверка во время выполнения? Конечно. «if (someObject instanceof Serializable) ...».

Вы хотите изменить определение объекта во время выполнения? Очень редко есть веская причина хотеть сделать это. Может быть, есть способ сделать это с помощью рефлексии, но у меня никогда не было причин хотеть делать такие вещи. Что вы пытаетесь достичь?

0 голосов
/ 07 сентября 2010

Помимо существующих хороших ответов, другой вопрос заключается в том, нужен ли вам Java Serializable для конкретной среды или просто нужно иметь возможность сериализовать объекты. Для последних существует гораздо больше вариантов, чем по умолчанию в JDK; и для многих вариантов использования альтернативы намного лучше, чем у JDK.

Если вам не нужен JDK, лучше использовать сериализацию на основе JSON или XML.

0 голосов
/ 07 сентября 2010

Вау.Зачем вам это нужно проверять во время выполнения?Не проще ли это обеспечить во время компиляции?Используя такой код.

public void someMethod(Serializable serializable){
}

Или вы можете сделать его более сложным.

public interface SerializableInterface implements Serializable{
// bla-bla
}

public void someMethod(SerializableInterface serializable){
}
...