Q:

Why Query, TermQuery etc. are not longer implementing Serializable in Lucene 4.0?

I need to send a class containing Lucene elements such as Query over the network using EJB and of course this class need to be serialized. I marked my class as Serializable but it does not seems to be enough:
org.apache.lucene.search.TermQuery is not Serializable

Indeed, when i read the javadoc of the last stable release of Lucene (4.0), i can see that TermQuery does not implement Serializable, Query neither. What i don't understand is why those classes used to implement Serializable in the last release (3.6.1), and why it's no longer the case?

A:

Mike McCandless, one of Lucene contributors as well as Lucene 4 changelog say:

All serialization code has been removed from Lucene's classes; you
  must handle serialization at a higher level in your application.

The actual commits were done against JIRA issues LUCENE-2908 and LUCENE-4037. The description of the former issue says:

We removed contrib/remote, but forgot to cleanup serialization hell
  everywhere. this is no longer needed, never really worked (e.g. across
  versions), and slows  development (e.g. i wasted a long time debugging
  stupid serialization of  Similarity.idfExplain when trying to make a
  patch for the scoring system).

Lucene is not alone thinking about throwing away serialization. For example, guava considered this, too.
Speaking about your problem - you should be able to always convert your query to a String representation (using .toString()) and back. Unless you do this million times a second, the overhead should be negligible.

