I found following five guidelines very useful as per my experience:-
1. All the beans stored in session scope, page flow scope, and view scope need to be serialized. We can serialize backingBean scope as well if any value is changing from the UI.
2. All the referenced member objects in the serialized class should implement Serializable interface.
3. It is strongly recommended that all serializable classes explicitly generate default serialVersionUID value from the JDeveloper.
4. Do not use any non-serializable (for example XMLGregorianCalendar) data type in the serialize class.
5. If any object (UI components) is not serializable then it must be marked Transient.