<!--
/***************************************************************************************************************************
 * 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.
 ***************************************************************************************************************************/
 -->

SerializerGroups and ParserGroups

<p>
	Above the serializers and parsers are the {@link oaj.serializer.SerializerGroup} and 
	{@link oaj.parser.ParserGroup} classes.
	These classes allow serializers and parsers to be retrieved by W3C-compliant HTTP <c>Accept</c> 
	and <c>Content-Type</c> values...
</p>
<p class='bpcode w800'>
	<jc>// Construct a new serializer group with configuration parameters that get applied to all serializers.</jc>
	SerializerGroup sg = SerializerGroup.<jsm>create</jsm>()
		.append(JsonSerializer.<jk>class</jk>, UrlEncodingSerializer.<jk>class</jk>);
		.ws   <jc>// or .useWhitespace(true)</jc>
		.pojoSwaps(TemporalCalendarSwap.IsoLocalDateTime.<jk>class</jk>)
		.build();

	<jc>// Find the appropriate serializer by Accept type and serialize our POJO to the specified writer.</jc>
	sg.getSerializer(<js>"text/invalid, text/json;q=0.8, text/*;q:0.6, *\/*;q=0.0"</js>)
		.serialize(myPersonObject, myWriter);
		
	<jc>// Construct a new parser group with configuration parameters that get applied to all parsers.</jc>
	ParserGroup pg = ParserGroup.<jsm>create</jsm>()
		.append(JsonSerializer.<jk>class</jk>, UrlEncodingSerializer.<jk>class</jk>);
 		.pojoSwaps(CalendarSwap.IsoLocalDateTime.<jk>class</jk>)
 		.build();

	Person p = pg.getParser(<js>"text/json"</js>).parse(myReader, Person.<jk>class</jk>);
</p>
<p>
	The REST servlet API builds upon the <c>SerializerGroup</c> and <c>ParserGroup</c> classes 
	to provide annotated REST servlets that automatically negotiate the HTTP media types and allow the developer
	to work with requests and responses as POJOs.
</p>			
