You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/03/10 16:51:11 UTC

[15/34] incubator-juneau git commit: Add builder classes for all serializers and parsers.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
index 1f3e218..33fad70 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
@@ -12,12 +12,11 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.serializer;
 
-import static org.apache.juneau.internal.ArrayUtils.*;
-
 import java.util.*;
 import java.util.concurrent.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.internal.*;
 
 /**
  * Represents a group of {@link Serializer Serializers} that can be looked up by media type.
@@ -45,87 +44,40 @@ import org.apache.juneau.*;
  * <h5 class='section'>Example:</h5>
  * <p class='bcode'>
  * 	<jc>// Construct a new serializer group</jc>
- * 	SerializerGroup g = <jk>new</jk> SerializerGroup();
- *
- * 	<jc>// Add some serializers to it</jc>
- * 	g.append(JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>);
- *
- * 	<jc>// Change settings for all serializers in the group and lock it.</jc>
- * 	g.setProperty(SerializerContext.<jsf>SERIALIZER_useWhitespace</jsf>, <jk>true</jk>)
- * 		.addPojoSwaps(CalendarSwap.ISO8601DT.<jk>class</jk>)
- * 		.lock();
+ * 	SerializerGroup g = <jk>new</jk> SerializerGroupBuilder();
+ * 		.append(JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>); <jc>// Add some serializers to it</jc>
+ * 		.ws().pojoSwaps(CalendarSwap.ISO8601DT.<jk>class</jk>) <jc>// Change settings for all serializers in the group.</jc>
+ * 		.build();
  *
  * 	<jc>// Find the appropriate serializer by Accept type</jc>
  * 	String mediaTypeMatch = g.findMatch(<js>"text/foo, text/json;q=0.8, text/*;q:0.6, *\/*;q=0.0"</js>);
- * 	WriterSerializer s = (WriterSerializer)g.getSerializer(mediaTypeMatch);
+ * 	WriterSerializer s = g.getWriterSerializer(mediaTypeMatch);
  *
  * 	<jc>// Serialize a bean to JSON text </jc>
  * 	AddressBook addressBook = <jk>new</jk> AddressBook();  <jc>// Bean to serialize.</jc>
  * 	String json = s.serialize(addressBook);
  * </p>
  */
-public final class SerializerGroup extends Lockable {
+public final class SerializerGroup {
 
 	// Maps Accept headers to matching serializers.
 	private final Map<String,SerializerMatch> cache = new ConcurrentHashMap<String,SerializerMatch>();
 
-	private final CopyOnWriteArrayList<Serializer> serializers = new CopyOnWriteArrayList<Serializer>();
-
-	/**
-	 * Adds the specified serializer to the beginning of this group.
-	 *
-	 * @param s The serializer to add to this group.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerGroup append(Serializer s) {
-		checkLock();
-		synchronized(this) {
-			cache.clear();
-			serializers.add(0, s);
-		}
-		return this;
-	}
-
-	/**
-	 * Registers the specified serializers with this group.
-	 *
-	 * @param s The serializers to append to this group.
-	 * @return This object (for method chaining).
-	 * @throws Exception Thrown if {@link Serializer} could not be constructed.
-	 */
-	public SerializerGroup append(Class<? extends Serializer>...s) throws Exception {
-		for (Class<? extends Serializer> ss : reverse(s))
-			append(ss);
-		return this;
-	}
+	final Serializer[] serializers;
+	private final PropertyStore propertyStore;
 
 	/**
-	 * Same as {@link #append(Class[])}, except specify a single class to avoid unchecked compile warnings.
+	 * Constructor.
 	 *
-	 * @param s The serializer to append to this group.
-	 * @return This object (for method chaining).
-	 * @throws Exception Thrown if {@link Serializer} could not be constructed.
+	 * @param propertyStore The modifiable properties that were used to initialize the serializers.
+	 * A snapshot of these will be made so that we can clone and modify this group.
+	 * @param serializers The serializers defined in this group.
+	 * The order is important because they will be tried in reverse order (e.g.
+	 * 	newer first) in which they will be tried to match against media types.
 	 */
-	public SerializerGroup append(Class<? extends Serializer> s) throws Exception {
-		try {
-			append(s.newInstance());
-		} catch (NoClassDefFoundError e) {
-			// Ignore if dependent library not found (e.g. Jena).
-			System.err.println(e); // NOT DEBUG
-		}
-		return this;
-	}
-
-	/**
-	 * Adds the serializers in the specified group to this group.
-	 *
-	 * @param g The group containing the serializers to add to this group.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerGroup append(SerializerGroup g) {
-		for (Serializer s : reverse(g.serializers.toArray(new Serializer[g.serializers.size()])))
-			append(s);
-		return this;
+	public SerializerGroup(PropertyStore propertyStore, Serializer[] serializers) {
+		this.propertyStore = PropertyStore.create(propertyStore);
+		this.serializers = ArrayUtils.reverse(serializers);
 	}
 
 	/**
@@ -224,9 +176,9 @@ public final class SerializerGroup extends Lockable {
 	}
 
 	/**
-	 * Returns the media types that all parsers in this group can handle
+	 * Returns the media types that all serializers in this group can handle.
 	 * <p>
-	 * Entries are ordered in the same order as the parsers in the group.
+	 * Entries are ordered in the same order as the serializers in the group.
 	 *
 	 * @return The list of media types.
 	 */
@@ -239,1225 +191,23 @@ public final class SerializerGroup extends Lockable {
 		return l;
 	}
 
-
-	//--------------------------------------------------------------------------------
-	// Properties
-	//--------------------------------------------------------------------------------
-
-	/**
-	 * Calls {@link Serializer#setMaxDepth(int)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_maxDepth
-	 */
-	public SerializerGroup setMaxDepth(int value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setMaxDepth(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setInitialDepth(int)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_initialDepth
-	 */
-	public SerializerGroup setInitialDepth(int value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setInitialDepth(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setDetectRecursions(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_detectRecursions
-	 */
-	public SerializerGroup setDetectRecursions(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setDetectRecursions(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setIgnoreRecursions(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_ignoreRecursions
-	 */
-	public SerializerGroup setIgnoreRecursions(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setIgnoreRecursions(value);
-		return this;
-	}
-
 	/**
-	 * Calls {@link Serializer#setUseWhitespace(boolean)} on all serializers in this group.
+	 * Returns a copy of the property store that was used to create the serializers in this group.
+	 * This method returns a new factory each time so is somewhat expensive.
 	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_useWhitespace
+	 * @return A new copy of the property store passed in to the constructor.
 	 */
-	public SerializerGroup setUseWhitespace(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setUseWhitespace(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setAddBeanTypeProperties(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_addBeanTypeProperties
-	 */
-	public SerializerGroup setAddBeanTypeProperties(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setAddBeanTypeProperties(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setQuoteChar(char)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_quoteChar
-	 */
-	public SerializerGroup setQuoteChar(char value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setQuoteChar(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setTrimNullProperties(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_trimNullProperties
-	 */
-	public SerializerGroup setTrimNullProperties(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setTrimNullProperties(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setTrimEmptyCollections(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_trimEmptyCollections
-	 */
-	public SerializerGroup setTrimEmptyCollections(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setTrimEmptyCollections(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setTrimEmptyMaps(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_trimEmptyMaps
-	 */
-	public SerializerGroup setTrimEmptyMaps(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setTrimEmptyMaps(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setTrimStrings(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_trimStrings
-	 */
-	public SerializerGroup setTrimStrings(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setTrimStrings(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setRelativeUriBase(String)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_relativeUriBase
-	 */
-	public SerializerGroup setRelativeUriBase(String value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setRelativeUriBase(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setAbsolutePathUriBase(String)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_absolutePathUriBase
-	 */
-	public SerializerGroup setAbsolutePathUriBase(String value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setAbsolutePathUriBase(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setSortCollections(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_sortCollections
-	 */
-	public SerializerGroup setSortCollections(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setSortCollections(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setSortMaps(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_sortMaps
-	 */
-	public SerializerGroup setSortMaps(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setSortMaps(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeansRequireDefaultConstructor(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beansRequireDefaultConstructor
-	 */
-	public SerializerGroup setBeansRequireDefaultConstructor(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeansRequireDefaultConstructor(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeansRequireSerializable(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beansRequireSerializable
-	 */
-	public SerializerGroup setBeansRequireSerializable(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeansRequireSerializable(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeansRequireSettersForGetters(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beansRequireSettersForGetters
-	 */
-	public SerializerGroup setBeansRequireSettersForGetters(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeansRequireSettersForGetters(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeansRequireSomeProperties(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beansRequireSomeProperties
-	 */
-	public SerializerGroup setBeansRequireSomeProperties(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeansRequireSomeProperties(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanMapPutReturnsOldValue(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanMapPutReturnsOldValue
-	 */
-	public SerializerGroup setBeanMapPutReturnsOldValue(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanMapPutReturnsOldValue(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanConstructorVisibility(Visibility)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanConstructorVisibility
-	 */
-	public SerializerGroup setBeanConstructorVisibility(Visibility value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanConstructorVisibility(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanClassVisibility(Visibility)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanClassVisibility
-	 */
-	public SerializerGroup setBeanClassVisibility(Visibility value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanClassVisibility(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanFieldVisibility(Visibility)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanFieldVisibility
-	 */
-	public SerializerGroup setBeanFieldVisibility(Visibility value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanFieldVisibility(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setMethodVisibility(Visibility)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_methodVisibility
-	 */
-	public SerializerGroup setMethodVisibility(Visibility value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setMethodVisibility(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setUseJavaBeanIntrospector(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_useJavaBeanIntrospector
-	 */
-	public SerializerGroup setUseJavaBeanIntrospector(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setUseJavaBeanIntrospector(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setUseInterfaceProxies(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_useInterfaceProxies
-	 */
-	public SerializerGroup setUseInterfaceProxies(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setUseInterfaceProxies(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setIgnoreUnknownBeanProperties(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_ignoreUnknownBeanProperties
-	 */
-	public SerializerGroup setIgnoreUnknownBeanProperties(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setIgnoreUnknownBeanProperties(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setIgnoreUnknownNullBeanProperties(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_ignoreUnknownNullBeanProperties
-	 */
-	public SerializerGroup setIgnoreUnknownNullBeanProperties(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setIgnoreUnknownNullBeanProperties(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setIgnorePropertiesWithoutSetters(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_ignorePropertiesWithoutSetters
-	 */
-	public SerializerGroup setIgnorePropertiesWithoutSetters(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setIgnorePropertiesWithoutSetters(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setIgnoreInvocationExceptionsOnGetters(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_ignoreInvocationExceptionsOnGetters
-	 */
-	public SerializerGroup setIgnoreInvocationExceptionsOnGetters(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setIgnoreInvocationExceptionsOnGetters(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setIgnoreInvocationExceptionsOnSetters(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_ignoreInvocationExceptionsOnSetters
-	 */
-	public SerializerGroup setIgnoreInvocationExceptionsOnSetters(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setIgnoreInvocationExceptionsOnSetters(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setSortProperties(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_sortProperties
-	 */
-	public SerializerGroup setSortProperties(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setSortProperties(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setNotBeanPackages(String...)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanPackages
-	 */
-	public SerializerGroup setNotBeanPackages(String...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setNotBeanPackages(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setNotBeanPackages(Collection)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanPackages
-	 */
-	public SerializerGroup setNotBeanPackages(Collection<String> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setNotBeanPackages(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addNotBeanPackages(String...)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanPackages
-	 * @see BeanContext#BEAN_notBeanPackages_remove
-	 */
-	public SerializerGroup addNotBeanPackages(String...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addNotBeanPackages(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addNotBeanPackages(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanPackages
-	 * @see BeanContext#BEAN_notBeanPackages_remove
-	 */
-	public SerializerGroup addNotBeanPackages(Collection<String> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addNotBeanPackages(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeNotBeanPackages(String...)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanPackages
-	 * @see BeanContext#BEAN_notBeanPackages_remove
-	 */
-	public SerializerGroup removeNotBeanPackages(String...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeNotBeanPackages(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeNotBeanPackages(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanPackages
-	 * @see BeanContext#BEAN_notBeanPackages_remove
-	 */
-	public SerializerGroup removeNotBeanPackages(Collection<String> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeNotBeanPackages(values);
-		return this;
+	public PropertyStore createPropertyStore() {
+		return PropertyStore.create(propertyStore);
 	}
 
 	/**
-	 * Calls {@link Serializer#setNotBeanClasses(Class...)} on all serializers in this group.
+	 * Returns a copy of the serializers in this group.
+	 * This method returns a new array each time so is somewhat expensive.
 	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanClasses
+	 * @return A new array containing the serializers in this group.
 	 */
-	public SerializerGroup setNotBeanClasses(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setNotBeanClasses(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setNotBeanClasses(Collection)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanPackages
-	 */
-	public SerializerGroup setNotBeanClasses(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setNotBeanClasses(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addNotBeanClasses(Class...)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanClasses
-	 * @see BeanContext#BEAN_notBeanClasses_add
-	 */
-	public SerializerGroup addNotBeanClasses(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addNotBeanClasses(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addNotBeanClasses(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanClasses
-	 * @see BeanContext#BEAN_notBeanClasses_add
-	 */
-	public SerializerGroup addNotBeanClasses(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addNotBeanClasses(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeNotBeanClasses(Class...)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanClasses
-	 * @see BeanContext#BEAN_notBeanClasses_remove
-	 */
-	public SerializerGroup removeNotBeanClasses(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeNotBeanClasses(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeNotBeanClasses(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_notBeanClasses
-	 * @see BeanContext#BEAN_notBeanClasses_remove
-	 */
-	public SerializerGroup removeNotBeanClasses(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeNotBeanClasses(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanFilters(Class...)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanFilters
-	 */
-	public SerializerGroup setBeanFilters(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanFilters(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanFilters(Collection)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanFilters
-	 */
-	public SerializerGroup setBeanFilters(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanFilters(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addBeanFilters(Class...)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanFilters
-	 * @see BeanContext#BEAN_beanFilters_add
-	 */
-	public SerializerGroup addBeanFilters(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addBeanFilters(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addBeanFilters(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanFilters
-	 * @see BeanContext#BEAN_beanFilters_add
-	 */
-	public SerializerGroup addBeanFilters(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addBeanFilters(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeBeanFilters(Class...)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanFilters
-	 * @see BeanContext#BEAN_beanFilters_remove
-	 */
-	public SerializerGroup removeBeanFilters(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeBeanFilters(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeBeanFilters(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanFilters
-	 * @see BeanContext#BEAN_beanFilters_remove
-	 */
-	public SerializerGroup removeBeanFilters(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeBeanFilters(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setPojoSwaps(Class...)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_pojoSwaps
-	 */
-	public SerializerGroup setPojoSwaps(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setPojoSwaps(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setPojoSwaps(Collection)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_pojoSwaps
-	 */
-	public SerializerGroup setPojoSwaps(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setPojoSwaps(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addPojoSwaps(Class...)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_pojoSwaps
-	 * @see BeanContext#BEAN_pojoSwaps_add
-	 */
-	public SerializerGroup addPojoSwaps(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addPojoSwaps(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addPojoSwaps(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_pojoSwaps
-	 * @see BeanContext#BEAN_pojoSwaps_add
-	 */
-	public SerializerGroup addPojoSwaps(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addPojoSwaps(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removePojoSwaps(Class...)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_pojoSwaps
-	 * @see BeanContext#BEAN_pojoSwaps_remove
-	 */
-	public SerializerGroup removePojoSwaps(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removePojoSwaps(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removePojoSwaps(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_pojoSwaps
-	 * @see BeanContext#BEAN_pojoSwaps_remove
-	 */
-	public SerializerGroup removePojoSwaps(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removePojoSwaps(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setImplClasses(Map)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_implClasses
-	 */
-	public SerializerGroup setImplClasses(Map<Class<?>,Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setImplClasses(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addImplClass(Class,Class)} on all serializers in this group.
-	 *
-	 * @param interfaceClass The interface class.
-	 * @param implClass The implementation class.
-	 * @param <T> The class type of the interface.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_implClasses
-	 * @see BeanContext#BEAN_implClasses_put
-	 */
-	public <T> SerializerGroup addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addImplClass(interfaceClass, implClass);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanDictionary(Class...)} on all serializers in this group.
-	 *
-	 * @param values The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanDictionary
-	 */
-	public SerializerGroup setBeanDictionary(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanDictionary(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanDictionary(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanDictionary
-	 * @see BeanContext#BEAN_beanDictionary_add
-	 */
-	public SerializerGroup setBeanDictionary(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanDictionary(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addToBeanDictionary(Class...)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanDictionary
-	 * @see BeanContext#BEAN_beanDictionary_add
-	 */
-	public SerializerGroup addToBeanDictionary(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addToBeanDictionary(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addToBeanDictionary(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to add to this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanDictionary
-	 * @see BeanContext#BEAN_beanDictionary_add
-	 */
-	public SerializerGroup addToBeanDictionary(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addToBeanDictionary(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeFromBeanDictionary(Class...)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanDictionary
-	 * @see BeanContext#BEAN_beanDictionary_remove
-	 */
-	public SerializerGroup removeFromBeanDictionary(Class<?>...values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeFromBeanDictionary(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeFromBeanDictionary(Collection)} on all serializers in this group.
-	 *
-	 * @param values The values to remove from this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanDictionary
-	 * @see BeanContext#BEAN_beanDictionary_remove
-	 */
-	public SerializerGroup removeFromBeanDictionary(Collection<Class<?>> values) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeFromBeanDictionary(values);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setBeanTypePropertyName(String)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_beanTypePropertyName
-	 */
-	public SerializerGroup setBeanTypePropertyName(String value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setBeanTypePropertyName(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setDefaultParser(Class)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_defaultParser
-	 */
-	public SerializerGroup setDefaultParser(Class<?> value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setDefaultParser(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setLocale(Locale)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_locale
-	 */
-	public SerializerGroup setLocale(Locale value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setLocale(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setTimeZone(TimeZone)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_timeZone
-	 */
-	public SerializerGroup setTimeZone(TimeZone value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setTimeZone(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setMediaType(MediaType)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_mediaType
-	 */
-	public SerializerGroup setMediaType(MediaType value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setMediaType(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setDebug(boolean)} on all serializers in this group.
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see BeanContext#BEAN_debug
-	 */
-	public SerializerGroup setDebug(boolean value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setDebug(value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setProperty(String,Object)} on all serializers in this group.
-	 *
-	 * @param name The property name.
-	 * @param value The property value.
-	 * @return This class (for method chaining).
-	 * @throws LockedException If {@link #lock()} has been called on this object or {@link ContextFactory} object.
-	 * @see ContextFactory#setProperty(String, Object)
-	 */
-	public SerializerGroup setProperty(String name, Object value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setProperty(name, value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#setProperties(ObjectMap)} on all serializers in this group.
-	 *
-	 * @param properties The properties to set on this class.
-	 * @return This class (for method chaining).
-	 * @throws LockedException If {@link #lock()} has been called on this object.
-	 * @see ContextFactory#setProperties(java.util.Map)
-	 */
-	public SerializerGroup setProperties(ObjectMap properties) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setProperties(properties);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#addToProperty(String,Object)} on all serializers in this group.
-	 *
-	 * @param name The property name.
-	 * @param value The new value to add to the SET property.
-	 * @return This object (for method chaining).
-	 * @throws ConfigException If property is not a SET property.
-	 * @throws LockedException If {@link #lock()} has been called on this object.
-	 */
-	public SerializerGroup addToProperty(String name, Object value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.addToProperty(name, value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#putToProperty(String,Object,Object)} on all serializers in this group.
-	 *
-	 * @param name The property name.
-	 * @param key The property value map key.
-	 * @param value The property value map value.
-	 * @return This object (for method chaining).
-	 * @throws ConfigException If property is not a MAP property.
-	 * @throws LockedException If {@link #lock()} has been called on this object.
-	 */
-	public SerializerGroup putToProperty(String name, Object key, Object value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.putToProperty(name, key, value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#putToProperty(String,Object)} on all serializers in this group.
-	 *
-	 * @param name The property value.
-	 * @param value The property value map value.
-	 * @return This object (for method chaining).
-	 * @throws ConfigException If property is not a MAP property.
-	 * @throws LockedException If {@link #lock()} has been called on this object.
-	 */
-	public SerializerGroup putToProperty(String name, Object value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.putToProperty(name, value);
-		return this;
-	}
-
-	/**
-	 * Calls {@link Serializer#removeFromProperty(String,Object)} on all serializers in this group.
-	 *
-	 * @param name The property name.
-	 * @param value The property value in the SET property.
-	 * @return This object (for method chaining).
-	 * @throws ConfigException If property is not a SET property.
-	 * @throws LockedException If {@link #lock()} has been called on this object.
-	 */
-	public SerializerGroup removeFromProperty(String name, Object value) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.removeFromProperty(name, value);
-		return this;
-	}
-
-
-	//--------------------------------------------------------------------------------
-	// Overridden methods
-	//--------------------------------------------------------------------------------
-
-	/**
-	 * Calls {@link Serializer#setClassLoader(ClassLoader)} on all serializers in this group.
-	 *
-	 * @param classLoader The new classloader.
-	 * @throws LockedException If {@link ContextFactory#lock()} was called on this class or the bean context.
-	 * @return This object (for method chaining).
-	 * @see ContextFactory#setClassLoader(ClassLoader)
-	 */
-	public SerializerGroup setClassLoader(ClassLoader classLoader) throws LockedException {
-		checkLock();
-		for (Serializer s : serializers)
-			s.setClassLoader(classLoader);
-		return this;
-	}
-
-	/**
-	 * Locks this group and all serializers in this group.
-	 */
-	@Override /* Lockable */
-	public SerializerGroup lock() {
-		super.lock();
-		for (Serializer s : serializers)
-			s.lock();
-		return this;
-	}
-
-	/**
-	 * Clones this group and all serializers in this group.
-	 */
-	@Override /* Lockable */
-	public SerializerGroup clone() throws CloneNotSupportedException {
-		SerializerGroup g = new SerializerGroup();
-
-		List<Serializer> l = new ArrayList<Serializer>(serializers.size());
-		for (Serializer s : serializers)
-			l.add(s.clone());
-
-		g.serializers.addAll(l);
-
-		return g;
+	public Serializer[] getSerializers() {
+		return ArrayUtils.reverse(serializers);
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
new file mode 100644
index 0000000..b639358
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
@@ -0,0 +1,983 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              *
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.serializer;
+
+import static org.apache.juneau.BeanContext.*;
+import static org.apache.juneau.serializer.SerializerContext.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+
+/**
+ * Builder class for creating instances of {@link SerializerGroup}.
+ */
+public class SerializerGroupBuilder {
+
+	private final List<Object> serializers;
+	private final PropertyStore propertyStore;
+
+	/**
+	 * Create an empty serializer group builder.
+	 */
+	public SerializerGroupBuilder() {
+		this.serializers = new ArrayList<Object>();
+		this.propertyStore = PropertyStore.create();
+	}
+
+	/**
+	 * Clone an existing serializer group builder.
+	 * @param copyFrom The serializer group that we're copying settings and serializers from.
+	 */
+	public SerializerGroupBuilder(SerializerGroup copyFrom) {
+		this.serializers = new ArrayList<Object>(Arrays.asList(copyFrom.serializers));
+		this.propertyStore = copyFrom.createPropertyStore();
+	}
+
+	/**
+	 * Registers the specified serializers with this group.
+	 *
+	 * @param s The serializers to append to this group.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroupBuilder append(Class<?>...s) {
+		serializers.addAll(Arrays.asList(s));
+		return this;
+	}
+
+	/**
+	 * Registers the specified serializers with this group.
+	 *
+	 * @param s The serializers to append to this group.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroupBuilder append(Serializer...s) {
+		serializers.addAll(Arrays.asList(s));
+		return this;
+	}
+
+	/**
+	 * Registers the specified serializers with this group.
+	 *
+	 * @param s The serializers to append to this group.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroupBuilder append(List<Serializer> s) {
+		serializers.addAll(s);
+		return this;
+	}
+
+	/**
+	 * Creates a new {@link SerializerGroup} object using a snapshot of the settings defined in this builder.
+	 * <p>
+	 * This method can be called multiple times to produce multiple serializer groups.
+	 *
+	 * @return A new {@link SerializerGroup} object.
+	 */
+	@SuppressWarnings("unchecked")
+	public SerializerGroup build() {
+		List<Serializer> l = new ArrayList<Serializer>();
+		for (Object s : serializers) {
+			Class<? extends Serializer> c = null;
+			PropertyStore ps = propertyStore;
+			if (s instanceof Class) {
+				c = ((Class<? extends Serializer>)s);
+			} else {
+				// Note that if we added a serializer instance, we want a new instance with this builder's properties
+				// on top of the previous serializer's properties.
+				Serializer s2 = (Serializer)s;
+				ps = s2.createPropertyStore().copyFrom(propertyStore);
+				c = s2.getClass();
+			}
+			try {
+				l.add(c.getConstructor(PropertyStore.class).newInstance(ps));
+			} catch (Exception e) {
+				throw new RuntimeException("Could not instantiate serializer " + c.getName(), e);
+			}
+		}
+		return new SerializerGroup(propertyStore, l.toArray(new Serializer[l.size()]));
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Sets a property on all serializers in this group.
+	 *
+	 * @param name The property name.
+	 * @param value The property value.
+	 * @return This object (for method chaining).
+	 * @see PropertyStore#setProperty(String, Object)
+	 */
+	public SerializerGroupBuilder property(String name, Object value) {
+		propertyStore.setProperty(name, value);
+		return this;
+	}
+
+	/**
+	 * Sets a set of properties on all serializers in this group.
+	 *
+	 * @param properties The properties to set on this class.
+	 * @return This object (for method chaining).
+	 * @see PropertyStore#setProperties(java.util.Map)
+	 */
+	public SerializerGroupBuilder properties(ObjectMap properties) {
+		propertyStore.setProperties(properties);
+		return this;
+	}
+
+	/**
+	 * Adds a value to a SET property on all serializers in this group.
+	 *
+	 * @param name The property name.
+	 * @param value The new value to add to the SET property.
+	 * @return This object (for method chaining).
+	 * @throws ConfigException If property is not a SET property.
+	 */
+	public SerializerGroupBuilder addToProperty(String name, Object value) {
+		propertyStore.addToProperty(name, value);
+		return this;
+	}
+
+	/**
+	 * Adds or overwrites a value to a MAP property on all serializers in this group.
+	 *
+	 * @param name The property name.
+	 * @param key The property value map key.
+	 * @param value The property value map value.
+	 * @return This object (for method chaining).
+	 * @throws ConfigException If property is not a MAP property.
+	 */
+	public SerializerGroupBuilder putToProperty(String name, Object key, Object value) {
+		propertyStore.putToProperty(name, key, value);
+		return this;
+	}
+
+	/**
+	 * Adds or overwrites a value to a MAP property on all serializers in this group.
+	 *
+	 * @param name The property value.
+	 * @param value The property value map value.
+	 * @return This object (for method chaining).
+	 * @throws ConfigException If property is not a MAP property.
+	 */
+	public SerializerGroupBuilder putToProperty(String name, Object value) {
+		propertyStore.putToProperty(name, value);
+		return this;
+	}
+
+	/**
+	 * Removes a value from a SET property on all serializers in this group.
+	 *
+	 * @param name The property name.
+	 * @param value The property value in the SET property.
+	 * @return This object (for method chaining).
+	 * @throws ConfigException If property is not a SET property.
+	 */
+	public SerializerGroupBuilder removeFromProperty(String name, Object value) {
+		propertyStore.removeFromProperty(name, value);
+		return this;
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_maxDepth} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_maxDepth
+	 */
+	public SerializerGroupBuilder maxDepth(int value) {
+		return property(SERIALIZER_maxDepth, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_initialDepth} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_initialDepth
+	 */
+	public SerializerGroupBuilder initialDepth(int value) {
+		return property(SERIALIZER_initialDepth, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_detectRecursions} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_detectRecursions
+	 */
+	public SerializerGroupBuilder detectRecursions(boolean value) {
+		return property(SERIALIZER_detectRecursions, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_ignoreRecursions} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_ignoreRecursions
+	 */
+	public SerializerGroupBuilder ignoreRecursions(boolean value) {
+		return property(SERIALIZER_ignoreRecursions, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_useWhitespace} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_useWhitespace
+	 */
+	public SerializerGroupBuilder useWhitespace(boolean value) {
+		return property(SERIALIZER_useWhitespace, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_addBeanTypeProperties} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_addBeanTypeProperties
+	 */
+	public SerializerGroupBuilder addBeanTypeProperties(boolean value) {
+		return property(SERIALIZER_addBeanTypeProperties, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_quoteChar} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_quoteChar
+	 */
+	public SerializerGroupBuilder quoteChar(char value) {
+		return property(SERIALIZER_quoteChar, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_trimNullProperties} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_trimNullProperties
+	 */
+	public SerializerGroupBuilder trimNullProperties(boolean value) {
+		return property(SERIALIZER_trimNullProperties, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_trimEmptyCollections} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_trimEmptyCollections
+	 */
+	public SerializerGroupBuilder trimEmptyCollections(boolean value) {
+		return property(SERIALIZER_trimEmptyCollections, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_trimEmptyMaps} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_trimEmptyMaps
+	 */
+	public SerializerGroupBuilder trimEmptyMaps(boolean value) {
+		return property(SERIALIZER_trimEmptyMaps, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_trimStrings} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_trimStrings
+	 */
+	public SerializerGroupBuilder trimStrings(boolean value) {
+		return property(SERIALIZER_trimStrings, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_relativeUriBase} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_relativeUriBase
+	 */
+	public SerializerGroupBuilder relativeUriBase(String value) {
+		return property(SERIALIZER_relativeUriBase, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_absolutePathUriBase} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_absolutePathUriBase
+	 */
+	public SerializerGroupBuilder absolutePathUriBase(String value) {
+		return property(SERIALIZER_absolutePathUriBase, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_sortCollections} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_sortCollections
+	 */
+	public SerializerGroupBuilder sortCollections(boolean value) {
+		return property(SERIALIZER_sortCollections, value);
+	}
+
+	/**
+	 * Sets the {@link SerializerContext#SERIALIZER_sortMaps} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see SerializerContext#SERIALIZER_sortMaps
+	 */
+	public SerializerGroupBuilder sortMaps(boolean value) {
+		return property(SERIALIZER_sortMaps, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beansRequireDefaultConstructor} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beansRequireDefaultConstructor
+	 */
+	public SerializerGroupBuilder beansRequireDefaultConstructor(boolean value) {
+		return property(BEAN_beansRequireDefaultConstructor, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beansRequireSerializable} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beansRequireSerializable
+	 */
+	public SerializerGroupBuilder beansRequireSerializable(boolean value) {
+		return property(BEAN_beansRequireSerializable, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beansRequireSettersForGetters} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beansRequireSettersForGetters
+	 */
+	public SerializerGroupBuilder beansRequireSettersForGetters(boolean value) {
+		return property(BEAN_beansRequireSettersForGetters, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beansRequireSomeProperties} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beansRequireSomeProperties
+	 */
+	public SerializerGroupBuilder beansRequireSomeProperties(boolean value) {
+		return property(BEAN_beansRequireSomeProperties, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanMapPutReturnsOldValue} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanMapPutReturnsOldValue
+	 */
+	public SerializerGroupBuilder beanMapPutReturnsOldValue(boolean value) {
+		return property(BEAN_beanMapPutReturnsOldValue, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanConstructorVisibility} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanConstructorVisibility
+	 */
+	public SerializerGroupBuilder beanConstructorVisibility(Visibility value) {
+		return property(BEAN_beanConstructorVisibility, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanClassVisibility} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanClassVisibility
+	 */
+	public SerializerGroupBuilder beanClassVisibility(Visibility value) {
+		return property(BEAN_beanClassVisibility, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFieldVisibility} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFieldVisibility
+	 */
+	public SerializerGroupBuilder beanFieldVisibility(Visibility value) {
+		return property(BEAN_beanFieldVisibility, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_methodVisibility} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_methodVisibility
+	 */
+	public SerializerGroupBuilder methodVisibility(Visibility value) {
+		return property(BEAN_methodVisibility, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_useJavaBeanIntrospector} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_useJavaBeanIntrospector
+	 */
+	public SerializerGroupBuilder useJavaBeanIntrospector(boolean value) {
+		return property(BEAN_useJavaBeanIntrospector, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_useInterfaceProxies} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_useInterfaceProxies
+	 */
+	public SerializerGroupBuilder useInterfaceProxies(boolean value) {
+		return property(BEAN_useInterfaceProxies, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignoreUnknownBeanProperties} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignoreUnknownBeanProperties
+	 */
+	public SerializerGroupBuilder ignoreUnknownBeanProperties(boolean value) {
+		return property(BEAN_ignoreUnknownBeanProperties, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignoreUnknownNullBeanProperties} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignoreUnknownNullBeanProperties
+	 */
+	public SerializerGroupBuilder ignoreUnknownNullBeanProperties(boolean value) {
+		return property(BEAN_ignoreUnknownNullBeanProperties, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignorePropertiesWithoutSetters} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignorePropertiesWithoutSetters
+	 */
+	public SerializerGroupBuilder ignorePropertiesWithoutSetters(boolean value) {
+		return property(BEAN_ignorePropertiesWithoutSetters, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignoreInvocationExceptionsOnGetters} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignoreInvocationExceptionsOnGetters
+	 */
+	public SerializerGroupBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
+		return property(BEAN_ignoreInvocationExceptionsOnGetters, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_ignoreInvocationExceptionsOnSetters} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_ignoreInvocationExceptionsOnSetters
+	 */
+	public SerializerGroupBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
+		return property(BEAN_ignoreInvocationExceptionsOnSetters, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_sortProperties} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_sortProperties
+	 */
+	public SerializerGroupBuilder sortProperties(boolean value) {
+		return property(BEAN_sortProperties, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages_add} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages_add
+	 */
+	public SerializerGroupBuilder notBeanPackages(String...values) {
+		return property(BEAN_notBeanPackages_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages_add} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages_add
+	 */
+	public SerializerGroupBuilder notBeanPackages(Collection<String> value) {
+		return property(BEAN_notBeanPackages_add, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages
+	 */
+	public SerializerGroupBuilder setNotBeanPackages(String...values) {
+		return property(BEAN_notBeanPackages, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages
+	 */
+	public SerializerGroupBuilder setNotBeanPackages(Collection<String> values) {
+		return property(BEAN_notBeanPackages, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages_remove
+	 */
+	public SerializerGroupBuilder removeNotBeanPackages(String...values) {
+		return property(BEAN_notBeanPackages_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanPackages_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages_remove
+	 */
+	public SerializerGroupBuilder removeNotBeanPackages(Collection<String> values) {
+		return property(BEAN_notBeanPackages_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses_add} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses_add
+	 */
+	public SerializerGroupBuilder notBeanClasses(Class<?>...values) {
+		return property(BEAN_notBeanClasses_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses_add} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanPackages_add
+	 */
+	public SerializerGroupBuilder notBeanClasses(Collection<Class<?>> values) {
+		return property(BEAN_notBeanClasses_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses
+	 */
+	public SerializerGroupBuilder setNotBeanClasses(Class<?>...values) {
+		return property(BEAN_notBeanClasses, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses
+	 */
+	public SerializerGroupBuilder setNotBeanClasses(Collection<Class<?>> values) {
+		return property(BEAN_notBeanClasses, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses_remove
+	 */
+	public SerializerGroupBuilder removeNotBeanClasses(Class<?>...values) {
+		return property(BEAN_notBeanClasses_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_notBeanClasses_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_notBeanClasses_remove
+	 */
+	public SerializerGroupBuilder removeNotBeanClasses(Collection<Class<?>> values) {
+		return property(BEAN_notBeanClasses_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters_add} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters_add
+	 */
+	public SerializerGroupBuilder beanFilters(Class<?>...values) {
+		return property(BEAN_beanFilters_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters_add} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters_add
+	 */
+	public SerializerGroupBuilder beanFilters(Collection<Class<?>> values) {
+		return property(BEAN_beanFilters_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters
+	 */
+	public SerializerGroupBuilder setBeanFilters(Class<?>...values) {
+		return property(BEAN_beanFilters, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters
+	 */
+	public SerializerGroupBuilder setBeanFilters(Collection<Class<?>> values) {
+		return property(BEAN_beanFilters, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters_remove
+	 */
+	public SerializerGroupBuilder removeBeanFilters(Class<?>...values) {
+		return property(BEAN_beanFilters_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanFilters_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanFilters_remove
+	 */
+	public SerializerGroupBuilder removeBeanFilters(Collection<Class<?>> values) {
+		return property(BEAN_beanFilters_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps_add} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps_add
+	 */
+	public SerializerGroupBuilder pojoSwaps(Class<?>...values) {
+		return property(BEAN_pojoSwaps_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps_add} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps_add
+	 */
+	public SerializerGroupBuilder pojoSwaps(Collection<Class<?>> values) {
+		return property(BEAN_pojoSwaps_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps
+	 */
+	public SerializerGroupBuilder setPojoSwaps(Class<?>...values) {
+		return property(BEAN_pojoSwaps, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps
+	 */
+	public SerializerGroupBuilder setPojoSwaps(Collection<Class<?>> values) {
+		return property(BEAN_pojoSwaps, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps_remove
+	 */
+	public SerializerGroupBuilder removePojoSwaps(Class<?>...values) {
+		return property(BEAN_pojoSwaps_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_pojoSwaps_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_pojoSwaps_remove
+	 */
+	public SerializerGroupBuilder removePojoSwaps(Collection<Class<?>> values) {
+		return property(BEAN_pojoSwaps_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_implClasses} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_implClasses
+	 */
+	public SerializerGroupBuilder implClasses(Map<Class<?>,Class<?>> values) {
+		return property(BEAN_implClasses, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_implClasses_put} property on all serializers in this group.
+	 *
+	 * @param interfaceClass The interface class.
+	 * @param implClass The implementation class.
+	 * @param <T> The class type of the interface.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_implClasses
+	 * @see BeanContext#BEAN_implClasses_put
+	 */
+	public <T> SerializerGroupBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+		return putToProperty(BEAN_implClasses, interfaceClass, implClass);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary_add} property on all serializers in this group.
+	 *
+	 * @param values The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary_add
+	 */
+	public SerializerGroupBuilder beanDictionary(Class<?>...values) {
+		return property(BEAN_beanDictionary_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary_add} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary_add
+	 */
+	public SerializerGroupBuilder beanDictionary(Collection<Class<?>> values) {
+		return property(BEAN_beanDictionary_add, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary
+	 */
+	public SerializerGroupBuilder setBeanDictionary(Class<?>...values) {
+		return property(BEAN_beanDictionary, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary} property on all serializers in this group.
+	 *
+	 * @param values The values to add to this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary
+	 */
+	public SerializerGroupBuilder setBeanDictionary(Collection<Class<?>> values) {
+		return property(BEAN_beanDictionary, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary_remove
+	 */
+	public SerializerGroupBuilder removeFromBeanDictionary(Class<?>...values) {
+		return property(BEAN_beanDictionary_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanDictionary_remove} property on all serializers in this group.
+	 *
+	 * @param values The values to remove from this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanDictionary_remove
+	 */
+	public SerializerGroupBuilder removeFromBeanDictionary(Collection<Class<?>> values) {
+		return property(BEAN_beanDictionary_remove, values);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_beanTypePropertyName} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_beanTypePropertyName
+	 */
+	public SerializerGroupBuilder beanTypePropertyName(String value) {
+		return property(BEAN_beanTypePropertyName, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_defaultParser} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_defaultParser
+	 */
+	public SerializerGroupBuilder defaultParser(Class<?> value) {
+		return property(BEAN_defaultParser, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_locale} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_locale
+	 */
+	public SerializerGroupBuilder locale(Locale value) {
+		return property(BEAN_locale, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_timeZone} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_timeZone
+	 */
+	public SerializerGroupBuilder timeZone(TimeZone value) {
+		return property(BEAN_timeZone, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_mediaType} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_mediaType
+	 */
+	public SerializerGroupBuilder mediaType(MediaType value) {
+		return property(BEAN_mediaType, value);
+	}
+
+	/**
+	 * Sets the {@link BeanContext#BEAN_debug} property on all serializers in this group.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 * @see BeanContext#BEAN_debug
+	 */
+	public SerializerGroupBuilder debug(boolean value) {
+		return property(BEAN_debug, value);
+	}
+
+	/**
+	 * Specifies the classloader to use when resolving classes from strings for all serializers in this group.
+	 * <p>
+	 * Can be used for resolving class names when the classes being created are in a different
+	 * 	classloader from the Juneau code.
+	 * <p>
+	 * If <jk>null</jk>, the system classloader will be used to resolve classes.
+	 *
+	 * @param classLoader The new classloader.
+	 * @return This object (for method chaining).
+	 * @see PropertyStore#setClassLoader(ClassLoader)
+	 */
+	public SerializerGroupBuilder classLoader(ClassLoader classLoader) {
+		propertyStore.setClassLoader(classLoader);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 34477b7..2fdfd0b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -86,7 +86,7 @@ public class SerializerSession extends BeanSession {
 	 * </ul>
 	 * @param op The override properties.
 	 * These override any context properties defined in the context.
-	 * @param javaMethod The java method that called this parser, usually the method in a REST servlet.
+	 * @param javaMethod The java method that called this serializer, usually the method in a REST servlet.
 	 * @param locale The session locale.
 	 * If <jk>null</jk>, then the locale defined on the context is used.
 	 * @param timeZone The session timezone.