org.codehaus.jackson.map.ser
Class BeanSerializerFactory

java.lang.Object
  extended by org.codehaus.jackson.map.SerializerFactory
      extended by org.codehaus.jackson.map.ser.BasicSerializerFactory
          extended by org.codehaus.jackson.map.ser.BeanSerializerFactory
Direct Known Subclasses:
CustomSerializerFactory

public class BeanSerializerFactory
extends BasicSerializerFactory

Factory class that can provide serializers for any regular Java beans (as defined by "having at least one get method recognizable as bean accessor" -- where Object.getClass() does not count); as well as for "standard" JDK types. Latter is achieved by delegating calls to BasicSerializerFactory to find serializers both for "standard" JDK types (and in some cases, sub-classes as is the case for collection classes like Lists and Maps) and bean (value) classes.

Note about delegating calls to BasicSerializerFactory: although it would be nicer to use linear delegation for construction (to essentially dispatch all calls first to the underlying BasicSerializerFactory; or alternatively after failing to provide bean-based serializer}, there is a problem: priority levels for detecting standard types are mixed. That is, we want to check if a type is a bean after some of "standard" JDK types, but before the rest. As a result, "mixed" delegation used, and calls are NOT done using regular SerializerFactory interface but rather via direct calls to BasicSerializerFactory.

Finally, since all caching is handled by the serializer provider (not factory), and since there is no configurability, this factory is stateless. And thus a global singleton instance can be used.


Nested Class Summary
 
Nested classes/interfaces inherited from class org.codehaus.jackson.map.ser.BasicSerializerFactory
BasicSerializerFactory.BooleanSerializer, BasicSerializerFactory.CalendarSerializer, BasicSerializerFactory.ClassSerializer, BasicSerializerFactory.DoubleSerializer, BasicSerializerFactory.EnumSerializer, BasicSerializerFactory.FloatSerializer, BasicSerializerFactory.IntegerSerializer, BasicSerializerFactory.IntLikeSerializer, BasicSerializerFactory.LongSerializer, BasicSerializerFactory.NullSerializer, BasicSerializerFactory.NumberSerializer, BasicSerializerFactory.SerializableSerializer, BasicSerializerFactory.SqlDateSerializer, BasicSerializerFactory.SqlTimeSerializer, BasicSerializerFactory.StringLikeSerializer<T>, BasicSerializerFactory.StringSerializer, BasicSerializerFactory.UtilDateSerializer
 
Field Summary
static BeanSerializerFactory instance
          Like BasicSerializerFactory, this factory is stateless, and thus a single shared global (== singleton) instance can be used without thread-safety issues.
 
Constructor Summary
protected BeanSerializerFactory()
          We will provide default constructor to allow sub-classing, but make it protected so that no non-singleton instances of the class will be instantiated.
 
Method Summary
protected  JsonSerializer<Object> constructBeanSerializer(Class<?> type, SerializationConfig config, BasicBeanDescription beanDesc)
           
protected  PropertyBuilder constructPropertyBuilder(SerializationConfig config, BasicBeanDescription beanDesc)
           
<T> JsonSerializer<T>
createSerializer(Class<T> type, SerializationConfig config)
          Main serializer constructor method.
protected  Collection<BeanPropertyWriter> findBeanProperties(SerializationConfig config, BasicBeanDescription beanDesc)
          Method used to collect all actual serializable properties
 JsonSerializer<Object> findBeanSerializer(Class<?> type, SerializationConfig config)
          Method that will try to construct a BeanSerializer for given class.
protected  boolean isPotentialBeanType(Class<?> type)
          Helper method used to skip processing for types that we know can not be (i.e.
protected  boolean usesStaticTyping(SerializationConfig config, BasicBeanDescription beanDesc)
          Helper method to check whether global settings and/or class annotations for the bean class indicate that static typing (declared types) should be used for properties.
 
Methods inherited from class org.codehaus.jackson.map.ser.BasicSerializerFactory
findSerializerByAddonType, findSerializerByLookup, findSerializerByPrimaryType, findSerializerFromAnnotation, getNullSerializer
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

instance

public static final BeanSerializerFactory instance
Like BasicSerializerFactory, this factory is stateless, and thus a single shared global (== singleton) instance can be used without thread-safety issues.

Constructor Detail

BeanSerializerFactory

protected BeanSerializerFactory()
We will provide default constructor to allow sub-classing, but make it protected so that no non-singleton instances of the class will be instantiated.

Method Detail

createSerializer

public <T> JsonSerializer<T> createSerializer(Class<T> type,
                                              SerializationConfig config)
Main serializer constructor method. We will have to be careful with respect to ordering of various method calls: essentially we want to reliably figure out which classes are standard types, and which are beans. The problem is that some bean Classes may implement standard interfaces (say, Iterable.

Note: sub-classes may choose to complete replace implementation, if they want to alter priority of serializer lookups.

Overrides:
createSerializer in class BasicSerializerFactory
Parameters:
type - Type to be serialized
config - Generic serialization configuration

findBeanSerializer

public JsonSerializer<Object> findBeanSerializer(Class<?> type,
                                                 SerializationConfig config)
Method that will try to construct a BeanSerializer for given class. Returns null if no properties are found.


isPotentialBeanType

protected boolean isPotentialBeanType(Class<?> type)
Helper method used to skip processing for types that we know can not be (i.e. are never consider to be) beans: things like primitives, Arrays, Enums, and proxy types.

Note that usually we shouldn't really be getting these sort of types anyway; but better safe than sorry.


constructBeanSerializer

protected JsonSerializer<Object> constructBeanSerializer(Class<?> type,
                                                         SerializationConfig config,
                                                         BasicBeanDescription beanDesc)

findBeanProperties

protected Collection<BeanPropertyWriter> findBeanProperties(SerializationConfig config,
                                                            BasicBeanDescription beanDesc)
Method used to collect all actual serializable properties


constructPropertyBuilder

protected PropertyBuilder constructPropertyBuilder(SerializationConfig config,
                                                   BasicBeanDescription beanDesc)

usesStaticTyping

protected boolean usesStaticTyping(SerializationConfig config,
                                   BasicBeanDescription beanDesc)
Helper method to check whether global settings and/or class annotations for the bean class indicate that static typing (declared types) should be used for properties. (instead of dynamic runtime types).