This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 050da605e Modernize tests
050da605e is described below

commit 050da605eb6f90612669d6f9b6d48b35beed7f9d
Author: James Bognar <[email protected]>
AuthorDate: Fri Aug 22 12:01:36 2025 -0400

    Modernize tests
---
 .../BeanTraverseProperties_ComboRoundTripTest.java |   6 +
 .../org/apache/juneau/ComboRoundTripTest_Base.java |   4 -
 .../org/apache/juneau/ComboRoundTripTester.java    |   6 +-
 .../java/org/apache/juneau/ComboSerializeTest.java | 279 --------
 .../org/apache/juneau/ComboSerializeTest_Base.java |  14 +-
 .../org/apache/juneau/ComboSerializeTester.java    |  12 +-
 .../apache/juneau/DynaBean_ComboRoundTripTest.java |   5 +-
 .../SerializerProperties_ComboRoundTripTest.java   |   5 +
 .../html5/Html5Template_ComboRoundTripTest.java    |   6 +
 .../juneau/dto/html5/Html5_ComboRoundTripTest.java |   5 +
 .../ReaderObject_ComboSerializeTest.java           | 303 +++++++++
 .../BeanDictionary_ComboRoundTripTest.java         |   4 +-
 .../transforms/Builder_ComboRoundTripTest.java     |   7 +
 .../ByteArrayBase64Swap_ComboRoundTripTest.java    |  10 +-
 .../ReaderObjectSwap_ComboSerializeTest.java       | 398 +++++++++++
 .../SwapsAnnotation_ComboSerializeTest.java        | 733 +++++++++++++++++++++
 16 files changed, 1477 insertions(+), 320 deletions(-)

diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/BeanTraverseProperties_ComboRoundTripTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/BeanTraverseProperties_ComboRoundTripTest.java
index f084a96c7..7142bd4a3 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/BeanTraverseProperties_ComboRoundTripTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/BeanTraverseProperties_ComboRoundTripTest.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau;
 
+import java.lang.reflect.*;
+
 import org.apache.juneau.BeanTraverseContext.*;
 
 /**
@@ -19,6 +21,10 @@ import org.apache.juneau.BeanTraverseContext.*;
  */
 class BeanTraverseProperties_ComboRoundTripTest extends 
ComboRoundTripTest_Base {
 
+       private static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
+               return ComboRoundTripTester.create(index, label, type, 
()->bean);
+       }
+
        private static ComboRoundTripTester<?>[] TESTERS = {
                tester(1, "BEANTRAVERSE_initialDepth", A.class, new A().init())
                        .json("{f:1}")
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest_Base.java 
b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest_Base.java
index cfa144766..b045c54c2 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest_Base.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest_Base.java
@@ -22,10 +22,6 @@ import org.junit.jupiter.params.provider.*;
  */
 public abstract class ComboRoundTripTest_Base extends SimpleTestBase {
 
-       protected static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
-               return ComboRoundTripTester.tester(index, label, type, bean);
-       }
-
        /**
         * Creates a ClassMeta for the given types.
         */
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTester.java 
b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTester.java
index 343744dc0..4416be190 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTester.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTester.java
@@ -36,11 +36,7 @@ import org.apache.juneau.xml.*;
  */
 public class ComboRoundTripTester<T> {
 
-       public static <T> Builder<T> tester(int index, String label, Type type, 
T in) {
-               return new Builder<>("["+index+"] " + label, type, in);
-       }
-
-       public static <T> Builder<T> tester(int index, String label, Type type, 
Supplier<T> in) {
+       public static <T> Builder<T> create(int index, String label, Type type, 
Supplier<T> in) {
                return new Builder<>("["+index+"] " + label, type, in);
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest.java
deleted file mode 100644
index 06ecd513b..000000000
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest.java
+++ /dev/null
@@ -1,279 +0,0 @@
-// 
***************************************************************************************************************************
-// * 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;
-
-import static org.apache.juneau.AssertionHelpers.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.junit.runners.MethodSorters.*;
-
-import java.util.*;
-
-import org.apache.juneau.common.internal.*;
-import org.apache.juneau.html.*;
-import org.apache.juneau.json.*;
-import org.apache.juneau.msgpack.*;
-import org.apache.juneau.serializer.*;
-import org.apache.juneau.uon.*;
-import org.apache.juneau.urlencoding.*;
-import org.apache.juneau.xml.*;
-import org.junit.*;
-
-/**
- * Superclass for tests that verify results against all supported content 
types.
- */
-@FixMethodOrder(NAME_ASCENDING)
-@SuppressWarnings("rawtypes")
-public abstract class ComboSerializeTest {
-
-       private final ComboInput comboInput;
-
-       private Map<Serializer,Serializer> serializerMap = new 
IdentityHashMap<>();
-
-       public ComboSerializeTest(ComboInput<?> comboInput) {
-               this.comboInput = comboInput;
-       }
-
-       private Serializer getSerializer(Serializer s) {
-               Serializer s2 = serializerMap.get(s);
-               if (s2 == null) {
-                       s2 = applySettings(s);
-                       serializerMap.put(s, s2);
-               }
-               return s2;
-       }
-
-       private boolean isSkipped(String testName, String expected) {
-               if ("SKIP".equals(expected) || 
comboInput.isTestSkipped(testName)) {
-                       System.err.println(getClass().getName() + ": " + 
comboInput.label + "/" + testName + " skipped.");  // NOT DEBUG
-                       return true;
-               }
-               return false;
-       }
-
-       private void testSerialize(String testName, Serializer s, String 
expected) throws Exception {
-               try {
-                       if (isSkipped(testName, expected))
-                               return;
-
-                       s = getSerializer(s);
-
-                       String r = s.serializeToString(comboInput.in.get());
-
-                       // Specifying "xxx" in the expected results will spit 
out what we should populate the field with.
-                       if (expected.equals("xxx")) {
-                               System.out.println(comboInput.label + "/" + 
testName + "=\n" + r.replaceAll("\n", "\\\\n").replaceAll("\t", "\\\\t")); // 
NOT DEBUG
-                               System.out.println(r);
-                               if (s instanceof MsgPackSerializer) {
-                                       System.out.println("decoded=["+new 
String(StringUtils.fromHex(r))+"]");
-                               }
-                       }
-
-                       assertEquals(expected, r, ss("{0}/{1} parse-normal 
failed: <<<MSG>>>", comboInput.label, testName));
-
-               } catch (AssertionError e) {
-                       if (comboInput.exceptionMsg == null)
-                               throw e;
-                       assertThrowable(Exception.class, 
comboInput.exceptionMsg, e);
-               } catch (Exception e) {
-                       if (comboInput.exceptionMsg == null) {
-                               e.printStackTrace();
-                               throw new AssertionError(comboInput.label + "/" 
+ testName + " failed.  exception=" + e.getLocalizedMessage());
-                       }
-                       assertThrowable(Exception.class, 
comboInput.exceptionMsg, e);
-               }
-       }
-
-       protected Serializer applySettings(Serializer s) {
-               return s;
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // JSON
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sJson = Json5Serializer.DEFAULT;
-
-       @Test
-       public void a11_serializeJson() throws Exception {
-               testSerialize("serializeJson", sJson, comboInput.json);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // JSON - 't' property
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sJsonT = 
Json5Serializer.create().json5().typePropertyName("t").build();
-
-       @Test
-       public void a21_serializeJsonT() throws Exception {
-               testSerialize("serializeJsonT", sJsonT, comboInput.jsonT);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // JSON - Readable
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sJsonR = Json5Serializer.DEFAULT_READABLE;
-
-       @Test
-       public void a31_serializeJsonR() throws Exception {
-               testSerialize("serializeJsonR", sJsonR, comboInput.jsonR);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // XML
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sXml = XmlSerializer.DEFAULT_SQ;
-
-       @Test
-       public void b11_serializeXml() throws Exception {
-               testSerialize("serializeXml", sXml, comboInput.xml);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // XML - 't' property
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sXmlT = 
XmlSerializer.create().sq().typePropertyName("t").build();
-
-       @Test
-       public void b21_serializeXmlT() throws Exception {
-               testSerialize("serializeXmlT", sXmlT, comboInput.xmlT);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // XML - Readable
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sXmlR = XmlSerializer.DEFAULT_SQ_READABLE;
-
-       @Test
-       public void b31_serializeXmlR() throws Exception {
-               testSerialize("serializeXmlR", sXmlR, comboInput.xmlR);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // XML - Namespaces
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sXmlNs = XmlSerializer.DEFAULT_NS_SQ;
-
-       @Test
-       public void b41_serializeXmlNs() throws Exception {
-               testSerialize("serializeXmlNs", sXmlNs, comboInput.xmlNs);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // HTML
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sHtml = HtmlSerializer.DEFAULT_SQ;
-
-       @Test
-       public void c11_serializeHtml() throws Exception {
-               testSerialize("serializeHtml", sHtml, comboInput.html);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // HTML - 't' property
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sHtmlT = 
HtmlSerializer.create().sq().typePropertyName("t").build();
-
-       @Test
-       public void c21_serializeHtmlT() throws Exception {
-               testSerialize("serializeHtmlT", sHtmlT, comboInput.htmlT);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // HTML - Readable
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sHtmlR = HtmlSerializer.DEFAULT_SQ_READABLE;
-
-       @Test
-       public void c31_serializeHtmlR() throws Exception {
-               testSerialize("serializeHtmlR", sHtmlR, comboInput.htmlR);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // UON
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sUon = UonSerializer.DEFAULT;
-
-       @Test
-       public void d11_serializeUon() throws Exception {
-               testSerialize("serializeUon", sUon, comboInput.uon);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // UON - 't' property
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sUonT = 
UonSerializer.create().typePropertyName("t").build();
-
-       @Test
-       public void d21_serializeUonT() throws Exception {
-               testSerialize("serializeUonT", sUonT, comboInput.uonT);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // UON - Readable
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sUonR = UonSerializer.DEFAULT_READABLE;
-
-       @Test
-       public void d31_serializeUonR() throws Exception {
-               testSerialize("serializeUonR", sUonR, comboInput.uonR);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // UrlEncoding
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sUrlEncoding = UrlEncodingSerializer.DEFAULT;
-
-       @Test
-       public void e11_serializeUrlEncoding() throws Exception {
-               testSerialize("serializeUrlEncoding", sUrlEncoding, 
comboInput.urlEncoding);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // UrlEncoding - 't' property
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sUrlEncodingT = 
UrlEncodingSerializer.create().typePropertyName("t").build();
-
-       @Test
-       public void e21_serializeUrlEncodingT() throws Exception {
-               testSerialize("serializeUrlEncodingT", sUrlEncodingT, 
comboInput.urlEncodingT);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // UrlEncoding - Readable
-       
//-----------------------------------------------------------------------------------------------------------------
-       WriterSerializer sUrlEncodingR = UrlEncodingSerializer.DEFAULT_READABLE;
-
-       @Test
-       public void e31_serializeUrlEncodingR() throws Exception {
-               testSerialize("serializeUrlEncodingR", sUrlEncodingR, 
comboInput.urlEncodingR);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // MsgPack
-       
//-----------------------------------------------------------------------------------------------------------------
-       OutputStreamSerializer sMsgPack = MsgPackSerializer.DEFAULT;
-
-       @Test
-       public void f11_serializeMsgPack() throws Exception {
-               testSerialize("serializeMsgPack", sMsgPack, comboInput.msgPack);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // MsgPack - 't' property
-       
//-----------------------------------------------------------------------------------------------------------------
-       OutputStreamSerializer sMsgPackT = 
MsgPackSerializer.create().typePropertyName("t").build();
-
-       @Test
-       public void f21_serializeMsgPackT() throws Exception {
-               testSerialize("serializeMsgPackT", sMsgPackT, 
comboInput.msgPackT);
-       }
-}
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest_Base.java 
b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest_Base.java
index aec76df75..798d0af6a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest_Base.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest_Base.java
@@ -12,25 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau;
 
-import java.lang.reflect.*;
-
 import org.junit.jupiter.params.*;
 import org.junit.jupiter.params.provider.*;
 
 /**
  * Superclass for tests that verify results against all supported content 
types.
  */
-public abstract class ComboSerializeTest_Base {
-
-       protected static <T> ComboSerializeTester.Builder<T> tester(int index, 
String label, T bean) {
-               return ComboSerializeTester.tester(index, label, bean);
-       }
-       /**
-        * Creates a ClassMeta for the given types.
-        */
-       public static final Type getType(Type type, Type...args) {
-               return BeanContext.DEFAULT_SESSION.getClassMeta(type, args);
-       }
+public abstract class ComboSerializeTest_Base extends SimpleTestBase {
 
        
//-----------------------------------------------------------------------------------------------------------------
        // JSON
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTester.java 
b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTester.java
index a63f4a1e8..e8c1c848f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTester.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTester.java
@@ -19,6 +19,7 @@ import static org.apache.juneau.AssertionHelpers.*;
 import java.util.*;
 import java.util.function.*;
 
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.msgpack.*;
@@ -34,11 +35,7 @@ import org.apache.juneau.xml.*;
  */
 public class ComboSerializeTester<T> {
 
-       public static <T> Builder<T> tester(int index, String label, T in) {
-               return new Builder<>("["+index+"] " + label, in);
-       }
-
-       public static <T> Builder<T> tester(int index, String label, 
Supplier<T> in) {
+       public static <T> Builder<T> create(int index, String label, 
Supplier<T> in) {
                return new Builder<>("["+index+"] " + label, in);
        }
 
@@ -116,7 +113,7 @@ public class ComboSerializeTester<T> {
                exceptionMsg = b.exceptionMsg;
 
                serializers.put("json", create(b, 
Json5Serializer.DEFAULT.copy().addBeanTypes().addRootType()));
-               serializers.put("jsonT", create(b, 
JsonSerializer.create().json5().typePropertyName("t").addBeanTypes().addRootType()));
+               serializers.put("jsonT", create(b, 
Json5Serializer.create().json5().typePropertyName("t").addBeanTypes().addRootType()));
                serializers.put("jsonR", create(b, 
Json5Serializer.DEFAULT_READABLE.copy().addBeanTypes().addRootType()));
                serializers.put("xml", create(b, 
XmlSerializer.DEFAULT_SQ.copy().addBeanTypes().addRootType()));
                serializers.put("xmlT", create(b, 
XmlSerializer.create().sq().typePropertyName("t").addBeanTypes().addRootType()));
@@ -163,6 +160,9 @@ public class ComboSerializeTester<T> {
                        if (eq(exp, "xxx")) {
                                System.out.println(getClass().getName() + ": " 
+ label + "/" + testName + "=\n" + r.replaceAll("\n", "\\\\n").replaceAll("\t", 
"\\\\t")); // NOT DEBUG
                                System.out.println(r);
+                               if (s instanceof MsgPackSerializer) {
+                                       System.out.println("decoded=["+new 
String(StringUtils.fromHex(r))+"]");
+                               }
                        }
 
                        assertEquals(exp, r, ss("{0}/{1} serialize-normal 
failed.", label, testName));
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/DynaBean_ComboRoundTripTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/DynaBean_ComboRoundTripTest.java
index 4b80bea3b..c3037c5e4 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/DynaBean_ComboRoundTripTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/DynaBean_ComboRoundTripTest.java
@@ -15,7 +15,6 @@ package org.apache.juneau;
 import static org.apache.juneau.assertions.Verify.*;
 
 import java.util.*;
-
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.serializer.*;
@@ -32,8 +31,8 @@ class DynaBean_ComboRoundTripTest extends 
ComboRoundTripTest_Base {
                SINGLE_DATE.set(1901, 2, 3, 10, 11, 12);
        }
 
-       protected static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Class<T> type, T bean) {
-               return ComboRoundTripTester.tester(index, label, type, 
bean).serializerApply(Serializer.Builder::keepNullProperties);
+       private static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Class<T> type, T bean) {
+               return ComboRoundTripTester.create(index, label, type, 
()->bean).serializerApply(Serializer.Builder::keepNullProperties);
        }
 
        private static ComboRoundTripTester<?>[] TESTERS = {
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/SerializerProperties_ComboRoundTripTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/SerializerProperties_ComboRoundTripTest.java
index 9a47404d9..c1658d083 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/SerializerProperties_ComboRoundTripTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/SerializerProperties_ComboRoundTripTest.java
@@ -14,6 +14,7 @@ package org.apache.juneau;
 
 import static org.apache.juneau.internal.CollectionUtils.*;
 
+import java.lang.reflect.*;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
@@ -28,6 +29,10 @@ import org.apache.juneau.xml.*;
 @SuppressWarnings({})
 class SerializerProperties_ComboRoundTripTest extends ComboRoundTripTest_Base {
 
+       private static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
+               return ComboRoundTripTester.create(index, label, type, 
()->bean);
+       }
+
        private static ComboRoundTripTester<?>[] TESTERS = {
                tester(1, "SERIALIZER_addBeanTypes", JsonMap.class, 
JsonMap.of("a", T0.create()))
                        .json("{a:{_type:'BwT',f:1}}")
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5Template_ComboRoundTripTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5Template_ComboRoundTripTest.java
index 351ae555f..098aee0d9 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5Template_ComboRoundTripTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5Template_ComboRoundTripTest.java
@@ -15,6 +15,8 @@ package org.apache.juneau.dto.html5;
 import static org.apache.juneau.assertions.Verify.*;
 import static org.apache.juneau.bean.html5.HtmlBuilder.*;
 
+import java.lang.reflect.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.bean.html5.*;
@@ -25,6 +27,10 @@ import org.apache.juneau.bean.html5.*;
 @SuppressWarnings({})
 class Html5Template_ComboRoundTripTest extends ComboRoundTripTest_Base {
 
+       private static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
+               return ComboRoundTripTester.create(index, label, type, 
()->bean);
+       }
+
        private static ComboRoundTripTester<?>[] TESTERS = {
                tester(1, "FormTemplate-1", FormTemplate.class, new 
FormTemplate("http://myaction";, 123, true))
                        
.json("{a:{action:'http://myaction'},c:[{_type:'input',a:{type:'text',name:'v1',value:123}},{_type:'input',a:{type:'text',name:'v2',value:true}}]}")
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5_ComboRoundTripTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5_ComboRoundTripTest.java
index af8eee9c8..2afd7f330 100755
--- 
a/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5_ComboRoundTripTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5_ComboRoundTripTest.java
@@ -18,6 +18,7 @@ import static org.apache.juneau.bean.html5.HtmlBuilder.map;
 import static org.apache.juneau.internal.CollectionUtils.*;
 import static org.apache.juneau.internal.CollectionUtils.map;
 
+import java.lang.reflect.*;
 import java.util.*;
 
 import org.apache.juneau.*;
@@ -37,6 +38,10 @@ class Html5_ComboRoundTripTest extends 
ComboRoundTripTest_Base {
                return HtmlBuilder.a(ref, children);
        }
 
+       private static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
+               return ComboRoundTripTester.create(index, label, type, 
()->bean);
+       }
+
        private static ComboRoundTripTester<?>[] TESTERS = {
                tester(1, "A", A.class, a2("http://foo";, "bar"))
                        .json("{_type:'a',a:{href:'http://foo'},c:['bar']}")
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/serializer/ReaderObject_ComboSerializeTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/serializer/ReaderObject_ComboSerializeTest.java
new file mode 100644
index 000000000..9f947215c
--- /dev/null
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/serializer/ReaderObject_ComboSerializeTest.java
@@ -0,0 +1,303 @@
+// 
***************************************************************************************************************************
+// * 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.internal.CollectionUtils.*;
+import static org.apache.juneau.internal.CollectionUtils.list;
+import static org.apache.juneau.utest.utils.Utils2.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.function.*;
+
+import org.apache.juneau.*;
+
+/**
+ * Verifies that Reader and InputStream objects are serialized correctly.
+ * Note that these are one-way serializations and you're not guaranteed to 
produce parsable output.
+ */
+public class ReaderObject_ComboSerializeTest extends ComboSerializeTest_Base {
+
+       private static <T> ComboSerializeTester.Builder<T> tester(int index, 
String label, Supplier<T> bean) {
+               return ComboSerializeTester.create(index, label, 
bean).serializerApply(Serializer.Builder::keepNullProperties);
+       }
+
+       private static ComboSerializeTester<?>[] TESTERS = {
+               tester(1, "SimpleReader", ()->reader("foobar"))
+                       .json("foobar")
+                       .jsonT("foobar")
+                       .jsonR("foobar")
+                       .xml("foobar")
+                       .xmlT("foobar")
+                       .xmlR("foobar\n")
+                       .xmlNs("foobar")
+                       .html("foobar")
+                       .htmlT("foobar")
+                       .htmlR("foobar")
+                       .uon("foobar")
+                       .uonT("foobar")
+                       .uonR("foobar")
+                       .urlEnc("foobar")
+                       .urlEncT("foobar")
+                       .urlEncR("foobar")
+                       .msgPack("666F6F626172")
+                       .msgPackT("666F6F626172")
+                       .build(),
+               tester(2, "SimpleInputStream", ()->inputStream("foobar"))
+                       .json("foobar")
+                       .jsonT("foobar")
+                       .jsonR("foobar")
+                       .xml("foobar")
+                       .xmlT("foobar")
+                       .xmlR("foobar\n")
+                       .xmlNs("foobar")
+                       .html("foobar")
+                       .htmlT("foobar")
+                       .htmlR("foobar")
+                       .uon("foobar")
+                       .uonT("foobar")
+                       .uonR("foobar")
+                       .urlEnc("foobar")
+                       .urlEncT("foobar")
+                       .urlEncR("foobar")
+                       .msgPack("666F6F626172")
+                       .msgPackT("666F6F626172")
+                       .build(),
+               tester(3, "BeanWithReaderField", ()->new 
BeanWithReaderField().init())
+                       .json("{f:fv}")
+                       .jsonT("{f:fv}")
+                       .jsonR("{\n\tf: fv\n}")
+                       .xml("<object><f>fv</f></object>")
+                       .xmlT("<object><f>fv</f></object>")
+                       .xmlR("<object>\n\t<f>fv</f>\n</object>\n")
+                       .xmlNs("<object><f>fv</f></object>")
+                       .html("<table><tr><td>f</td><td>fv</td></tr></table>")
+                       .htmlT("<table><tr><td>f</td><td>fv</td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>fv</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=fv)")
+                       .uonT("(f=fv)")
+                       .uonR("(\n\tf=fv\n)")
+                       .urlEnc("f=fv")
+                       .urlEncT("f=fv")
+                       .urlEncR("f=fv")
+                       .msgPack("81A1666676")
+                       .msgPackT("81A1666676")
+                       .build(),
+               tester(4, "BeanWithReader1dField", ()->new 
BeanWithReader1dField().init())
+                       .json("{f:[fv1,fv2,null]}")
+                       .jsonT("{f:[fv1,fv2,null]}")
+                       .jsonR("{\n\tf: 
[\n\t\tfv1,\n\t\tfv2,\n\t\tnull\n\t]\n}")
+                       .xml("<object><f>fv1fv2<null/></f></object>")
+                       .xmlT("<object><f>fv1fv2<null/></f></object>")
+                       
.xmlR("<object>\n\t<f>\n\t\tfv1\n\t\tfv2\n\t\t<null/>\n\t</f>\n</object>\n")
+                       .xmlNs("<object><f>fv1fv2<null/></f></object>")
+                       
.html("<table><tr><td>f</td><td><ul><li>fv1</li><li>fv2</li><li><null/></li></ul></td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td><ul><li>fv1</li><li>fv2</li><li><null/></li></ul></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>fv1</li>\n\t\t\t\t<li>fv2</li>\n\t\t\t\t<li><null/></li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=@(fv1,fv2,null))")
+                       .uonT("(f=@(fv1,fv2,null))")
+                       .uonR("(\n\tf=@(\n\t\tfv1,\n\t\tfv2,\n\t\tnull\n\t)\n)")
+                       .urlEnc("f=@(fv1,fv2,null)")
+                       .urlEncT("f=@(fv1,fv2,null)")
+                       .urlEncR("f=@(\n\tfv1,\n\tfv2,\n\tnull\n)")
+                       .msgPack("81A16693667631667632C0")
+                       .msgPackT("81A16693667631667632C0")
+                       .build(),
+               tester(5, "BeanWithReaderNullField", ()->new 
BeanWithReaderNullField().init())
+                       .json("{f:null}")
+                       .jsonT("{f:null}")
+                       .jsonR("{\n\tf: null\n}")
+                       .xml("<object><f _type='null'/></object>")
+                       .xmlT("<object><f t='null'/></object>")
+                       .xmlR("<object>\n\t<f _type='null'/>\n</object>\n")
+                       .xmlNs("<object><f _type='null'/></object>")
+                       
.html("<table><tr><td>f</td><td><null/></td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td><null/></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td><null/></td>\n\t</tr>\n</table>\n")
+                       .uon("(f=null)")
+                       .uonT("(f=null)")
+                       .uonR("(\n\tf=null\n)")
+                       .urlEnc("f=null")
+                       .urlEncT("f=null")
+                       .urlEncR("f=null")
+                       .msgPack("81A166C0")
+                       .msgPackT("81A166C0")
+                       .build(),
+               tester(6, "BeanWithReaderListField", ()->new 
BeanWithReaderListField().init())
+                       .json("{f:[fv1,fv2,null]}")
+                       .jsonT("{f:[fv1,fv2,null]}")
+                       .jsonR("{\n\tf: 
[\n\t\tfv1,\n\t\tfv2,\n\t\tnull\n\t]\n}")
+                       .xml("<object><f>fv1fv2<null/></f></object>")
+                       .xmlT("<object><f>fv1fv2<null/></f></object>")
+                       
.xmlR("<object>\n\t<f>\n\t\tfv1\n\t\tfv2\n\t\t<null/>\n\t</f>\n</object>\n")
+                       .xmlNs("<object><f>fv1fv2<null/></f></object>")
+                       
.html("<table><tr><td>f</td><td><ul><li>fv1</li><li>fv2</li><li><null/></li></ul></td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td><ul><li>fv1</li><li>fv2</li><li><null/></li></ul></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>fv1</li>\n\t\t\t\t<li>fv2</li>\n\t\t\t\t<li><null/></li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=@(fv1,fv2,null))")
+                       .uonT("(f=@(fv1,fv2,null))")
+                       .uonR("(\n\tf=@(\n\t\tfv1,\n\t\tfv2,\n\t\tnull\n\t)\n)")
+                       .urlEnc("f=@(fv1,fv2,null)")
+                       .urlEncT("f=@(fv1,fv2,null)")
+                       .urlEncR("f=@(\n\tfv1,\n\tfv2,\n\tnull\n)")
+                       .msgPack("81A16693667631667632C0")
+                       .msgPackT("81A16693667631667632C0")
+                       .build(),
+               tester(7, "BeanWithReaderMapField", ()->new 
BeanWithReaderMapField().init())
+                       .json("{f:{foo:fv1,bar:null,null:fv2}}")
+                       .jsonT("{f:{foo:fv1,bar:null,null:fv2}}")
+                       .jsonR("{\n\tf: {\n\t\tfoo: fv1,\n\t\tbar: 
null,\n\t\tnull: fv2\n\t}\n}")
+                       .xml("<object><f><foo>fv1</foo><bar 
_type='null'/><_x0000_>fv2</_x0000_></f></object>")
+                       .xmlT("<object><f><foo>fv1</foo><bar 
t='null'/><_x0000_>fv2</_x0000_></f></object>")
+                       .xmlR("<object>\n\t<f>\n\t\t<foo>fv1</foo>\n\t\t<bar 
_type='null'/>\n\t\t<_x0000_>fv2</_x0000_>\n\t</f>\n</object>\n")
+                       .xmlNs("<object><f><foo>fv1</foo><bar 
_type='null'/><_x0000_>fv2</_x0000_></f></object>")
+                       
.html("<table><tr><td>f</td><td><table><tr><td>foo</td><td>fv1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>fv2</td></tr></table></td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td><table><tr><td>foo</td><td>fv1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>fv2</td></tr></table></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>foo</td>\n\t\t\t\t\t<td>fv1</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>bar</td>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t\t<td>fv2</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=(foo=fv1,bar=null,null=fv2))")
+                       .uonT("(f=(foo=fv1,bar=null,null=fv2))")
+                       
.uonR("(\n\tf=(\n\t\tfoo=fv1,\n\t\tbar=null,\n\t\tnull=fv2\n\t)\n)")
+                       .urlEnc("f=(foo=fv1,bar=null,null=fv2)")
+                       .urlEncT("f=(foo=fv1,bar=null,null=fv2)")
+                       .urlEncR("f=(\n\tfoo=fv1,\n\tbar=null,\n\tnull=fv2\n)")
+                       .msgPack("81A16683A3666F6F667631A3626172C0C0667632")
+                       .msgPackT("81A16683A3666F6F667631A3626172C0C0667632")
+                       .build(),
+               tester(8, "BeanWithReaderBeanListField", ()->new 
BeanWithReaderBeanListField().init())
+                       
.json("{f:[{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}},null]}")
+                       
.jsonT("{f:[{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}},null]}")
+                       .jsonR("{\n\tf: [\n\t\t{\n\t\t\tf1: f1v,\n\t\t\tf2: 
[\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf3: 
null,\n\t\t\tf4: 
[\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf5: 
{\n\t\t\t\tfoo: f5v1,\n\t\t\t\tbar: null,\n\t\t\t\tnull: 
f5v2\n\t\t\t}\n\t\t},\n\t\tnull\n\t]\n}")
+                       
.xml("<object><f><object><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
_type='null'/><_x0000_>f5v2</_x0000_></f5></object><null/></f></object>")
+                       
.xmlT("<object><f><object><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
t='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
t='null'/><_x0000_>f5v2</_x0000_></f5></object><null/></f></object>")
+                       
.xmlR("<object>\n\t<f>\n\t\t<object>\n\t\t\t<f1>f1v</f1>\n\t\t\t<f2>\n\t\t\t\tf2v1\n\t\t\t\tf2v2\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f3
 
_type='null'/>\n\t\t\t<f4>\n\t\t\t\tf4v1\n\t\t\t\tf4v2\n\t\t\t\t<null/>\n\t\t\t</f4>\n\t\t\t<f5>\n\t\t\t\t<foo>f5v1</foo>\n\t\t\t\t<bar
 
_type='null'/>\n\t\t\t\t<_x0000_>f5v2</_x0000_>\n\t\t\t</f5>\n\t\t</object>\n\t\t<null/>\n\t</f>\n</object>\n")
+                       
.xmlNs("<object><f><object><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
_type='null'/><_x0000_>f5v2</_x0000_></f5></object><null/></f></object>")
+                       
.html("<table><tr><td>f</td><td><ul><li><table><tr><td>f1</td><td>f1v</td></tr><tr><td>f2</td><td><ul><li>f2v1</li><li>f2v2</li><li><null/></li></ul></td></tr><tr><td>f3</td><td><null/></td></tr><tr><td>f4</td><td><ul><li>f4v1</li><li>f4v2</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>f5v1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>f5v2</td></tr></table></td></tr></table></li><li><null/></li></ul></td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td><ul><li><table><tr><td>f1</td><td>f1v</td></tr><tr><td>f2</td><td><ul><li>f2v1</li><li>f2v2</li><li><null/></li></ul></td></tr><tr><td>f3</td><td><null/></td></tr><tr><td>f4</td><td><ul><li>f4v1</li><li>f4v2</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>f5v1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>f5v2</td></tr></table></td></tr></table></li><li><null/></li></ul></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<table>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>f1</td>\n\t\t\t\t\t\t\t<td>f1v</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>f2</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t<li>f2v1</li>\n\t\t\t\t\t\t\t\t\t<li>f2v2</li>\n\t\t\t\t\t\t\t\t\t<li><null/></li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>f3</td>\n\t\t
 [...]
+                       
.uon("(f=@((f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),null))")
+                       
.uonT("(f=@((f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),null))")
+                       
.uonR("(\n\tf=@(\n\t\t(\n\t\t\tf1=f1v,\n\t\t\tf2=@(\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf3=null,\n\t\t\tf4=@(\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t\tfoo=f5v1,\n\t\t\t\tbar=null,\n\t\t\t\tnull=f5v2\n\t\t\t)\n\t\t),\n\t\tnull\n\t)\n)")
+                       
.urlEnc("f=@((f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),null)")
+                       
.urlEncT("f=@((f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),null)")
+                       
.urlEncR("f=@(\n\t(\n\t\tf1=f1v,\n\t\tf2=@(\n\t\t\tf2v1,\n\t\t\tf2v2,\n\t\t\tnull\n\t\t),\n\t\tf3=null,\n\t\tf4=@(\n\t\t\tf4v1,\n\t\t\tf4v2,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=f5v1,\n\t\t\tbar=null,\n\t\t\tnull=f5v2\n\t\t)\n\t),\n\tnull\n)")
+                       
.msgPack("81A1669285A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632C0")
+                       
.msgPackT("81A1669285A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632C0")
+                       
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:f1>f1v</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>f2v1</rdf:li>\n<rdf:li>f2v2</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>f4v1</rdf:li>\n<rdf:li>f4v2</rdf:li>\n<rdf:li
 rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rd [...]
+                       
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:f1>f1v</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>f2v1</rdf:li>\n<rdf:li>f2v2</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>f4v1</rdf:li>\n<rdf:li>f4v2</rdf:li>\n<rdf:li
 rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</r [...]
+                       
.msgPack("81A1669285A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632C0")
+                       
.msgPackT("81A1669285A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632C0")
+                       .build(),
+               tester(9, "BeanWithReaderBeanMapField", ()->new 
BeanWithReaderBeanMapField().init())
+                       
.json("{f:{foo:{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}},bar:null,null:{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}}}}")
+                       
.jsonT("{f:{foo:{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}},bar:null,null:{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}}}}")
+                       .jsonR("{\n\tf: {\n\t\tfoo: {\n\t\t\tf1: 
f1v,\n\t\t\tf2: 
[\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf3: 
null,\n\t\t\tf4: 
[\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf5: 
{\n\t\t\t\tfoo: f5v1,\n\t\t\t\tbar: null,\n\t\t\t\tnull: 
f5v2\n\t\t\t}\n\t\t},\n\t\tbar: null,\n\t\tnull: {\n\t\t\tf1: f1v,\n\t\t\tf2: 
[\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf3: 
null,\n\t\t\tf4: [\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\ 
[...]
+                       
.xml("<object><f><foo><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
_type='null'/><_x0000_>f5v2</_x0000_></f5></foo><bar 
_type='null'/><_x0000_><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
_type='null'/><_x0000_>f5v2</_x0000_></f5></_x0000_></f></object>")
+                       
.xmlT("<object><f><foo><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
t='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
t='null'/><_x0000_>f5v2</_x0000_></f5></foo><bar 
t='null'/><_x0000_><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
t='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
t='null'/><_x0000_>f5v2</_x0000_></f5></_x0000_></f></object>")
+                       
.xmlR("<object>\n\t<f>\n\t\t<foo>\n\t\t\t<f1>f1v</f1>\n\t\t\t<f2>\n\t\t\t\tf2v1\n\t\t\t\tf2v2\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f3
 
_type='null'/>\n\t\t\t<f4>\n\t\t\t\tf4v1\n\t\t\t\tf4v2\n\t\t\t\t<null/>\n\t\t\t</f4>\n\t\t\t<f5>\n\t\t\t\t<foo>f5v1</foo>\n\t\t\t\t<bar
 
_type='null'/>\n\t\t\t\t<_x0000_>f5v2</_x0000_>\n\t\t\t</f5>\n\t\t</foo>\n\t\t<bar
 
_type='null'/>\n\t\t<_x0000_>\n\t\t\t<f1>f1v</f1>\n\t\t\t<f2>\n\t\t\t\tf2v1\n\t\t\t\tf2v2\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f3
 _typ [...]
+                       
.xmlNs("<object><f><foo><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
_type='null'/><_x0000_>f5v2</_x0000_></f5></foo><bar 
_type='null'/><_x0000_><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3 
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar 
_type='null'/><_x0000_>f5v2</_x0000_></f5></_x0000_></f></object>")
+                       
.html("<table><tr><td>f</td><td><table><tr><td>foo</td><td><table><tr><td>f1</td><td>f1v</td></tr><tr><td>f2</td><td><ul><li>f2v1</li><li>f2v2</li><li><null/></li></ul></td></tr><tr><td>f3</td><td><null/></td></tr><tr><td>f4</td><td><ul><li>f4v1</li><li>f4v2</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>f5v1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>f5v2</td></tr></table></td></tr></table></td></tr><tr><td>bar</td><td><nul
 [...]
+                       
.htmlT("<table><tr><td>f</td><td><table><tr><td>foo</td><td><table><tr><td>f1</td><td>f1v</td></tr><tr><td>f2</td><td><ul><li>f2v1</li><li>f2v2</li><li><null/></li></ul></td></tr><tr><td>f3</td><td><null/></td></tr><tr><td>f4</td><td><ul><li>f4v1</li><li>f4v2</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>f5v1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>f5v2</td></tr></table></td></tr></table></td></tr><tr><td>bar</td><td><nu
 [...]
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>foo</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>f1</td>\n\t\t\t\t\t\t\t\t<td>f1v</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>f2</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t<li>f2v1</li>\n\t\t\t\t\t\t\t\t\t\t<li>f2v2</li>\n\t\t\t\t\t\t\t\t\t\t<li><null/></li>\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t</td
 [...]
+                       
.uon("(f=(foo=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),bar=null,null=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2))))")
+                       
.uonT("(f=(foo=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),bar=null,null=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2))))")
+                       
.uonR("(\n\tf=(\n\t\tfoo=(\n\t\t\tf1=f1v,\n\t\t\tf2=@(\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf3=null,\n\t\t\tf4=@(\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t\tfoo=f5v1,\n\t\t\t\tbar=null,\n\t\t\t\tnull=f5v2\n\t\t\t)\n\t\t),\n\t\tbar=null,\n\t\tnull=(\n\t\t\tf1=f1v,\n\t\t\tf2=@(\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf3=null,\n\t\t\tf4=@(\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t
 [...]
+                       
.urlEnc("f=(foo=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),bar=null,null=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)))")
+                       
.urlEncT("f=(foo=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),bar=null,null=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)))")
+                       
.urlEncR("f=(\n\tfoo=(\n\t\tf1=f1v,\n\t\tf2=@(\n\t\t\tf2v1,\n\t\t\tf2v2,\n\t\t\tnull\n\t\t),\n\t\tf3=null,\n\t\tf4=@(\n\t\t\tf4v1,\n\t\t\tf4v2,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=f5v1,\n\t\t\tbar=null,\n\t\t\tnull=f5v2\n\t\t)\n\t),\n\tbar=null,\n\tnull=(\n\t\tf1=f1v,\n\t\tf2=@(\n\t\t\tf2v1,\n\t\t\tf2v2,\n\t\t\tnull\n\t\t),\n\t\tf3=null,\n\t\tf4=@(\n\t\t\tf4v1,\n\t\t\tf4v2,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=f5v1,\n\t\t\tbar=null,\n\t\t\tnull=f5v2\n\t\t)\n\t)\n)")
+                       
.msgPack("81A16683A3666F6F85A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632A3626172C0C085A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632")
+                       
.msgPackT("81A16683A3666F6F85A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632A3626172C0C085A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632")
+                       .rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:parseType='Resource'>\n<jp:foo 
rdf:parseType='Resource'>\n<jp:f1>f1v</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>f2v1</rdf:li>\n<rdf:li>f2v2</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>f4v1</rdf:li>\n<rdf:li>f4v2</rdf:li>\n<rdf:li
 rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-n [...]
+                       .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:parseType='Resource'>\n<jp:foo 
rdf:parseType='Resource'>\n<jp:f1>f1v</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>f2v1</rdf:li>\n<rdf:li>f2v2</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>f4v1</rdf:li>\n<rdf:li>f4v2</rdf:li>\n<rdf:li
 rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax- [...]
+                       
.msgPack("81A16683A3666F6F85A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632A3626172C0C085A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632")
+                       
.msgPackT("81A16683A3666F6F85A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632A3626172C0C085A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632")
+                       .build()
+       };
+
+       static ComboSerializeTester<?>[] testers() {
+               return TESTERS;
+       }
+
+       public static class BeanWithReaderField {
+               public Reader f;
+               public BeanWithReaderField init() {
+                       f = reader("fv");
+                       return this;
+               }
+       }
+
+       public static class BeanWithReader1dField {
+               public Reader[] f;
+               public BeanWithReader1dField init() {
+                       f = new Reader[]{reader("fv1"),reader("fv2"),null};
+                       return this;
+               }
+       }
+
+       public static class BeanWithReaderNullField {
+               public Reader f;
+               public BeanWithReaderNullField init() {
+                       f = null;
+                       return this;
+               }
+       }
+
+       public static class BeanWithReaderListField {
+               public List<Reader> f;
+               public BeanWithReaderListField init() {
+                       f = list(reader("fv1"),reader("fv2"),null);
+                       return this;
+               }
+       }
+
+       public static class BeanWithReaderMapField {
+               public Map<String,Reader> f;
+               public BeanWithReaderMapField init() {
+                       f = 
map("foo",reader("fv1"),"bar",null,null,reader("fv2"));
+                       return this;
+               }
+       }
+
+       public static class BeanWithReaderBeanListField {
+               public List<B> f;
+               public BeanWithReaderBeanListField init() {
+                       f = list(new B().init(),null);
+                       return this;
+               }
+       }
+
+       public static class BeanWithReaderBeanMapField {
+               public Map<String,B> f;
+               public BeanWithReaderBeanMapField init() {
+                       f = map("foo",new B().init(),"bar",null,null,new 
B().init());
+                       return this;
+               }
+       }
+
+       public static class B {
+               public Reader f1;
+               public Reader[] f2;
+               public Reader f3;
+               public List<Reader> f4;
+               public Map<String,Reader> f5;
+
+               public B init() {
+                       f1 = reader("f1v");
+                       f2 = new Reader[]{reader("f2v1"),reader("f2v2"),null};
+                       f3 = null;
+                       f4 = list(reader("f4v1"),reader("f4v2"),null)
+                       ;
+                       f5 = 
map("foo",reader("f5v1"),"bar",null,null,reader("f5v2"));
+                       return this;
+               }
+       }
+}
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/BeanDictionary_ComboRoundTripTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/BeanDictionary_ComboRoundTripTest.java
index f94dce5ab..cd7070ccb 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/BeanDictionary_ComboRoundTripTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/BeanDictionary_ComboRoundTripTest.java
@@ -27,8 +27,8 @@ import org.apache.juneau.serializer.*;
  */
 class BeanDictionary_ComboRoundTripTest extends ComboRoundTripTest_Base {
 
-       public static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
-               return ComboRoundTripTester.tester(index, label, type, 
bean).serializerApply(Serializer.Builder::keepNullProperties);
+       private static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
+               return ComboRoundTripTester.create(index, label, type, 
()->bean).serializerApply(Serializer.Builder::keepNullProperties);
        }
 
        private static ComboRoundTripTester<?>[] TESTERS = {
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/Builder_ComboRoundTripTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/Builder_ComboRoundTripTest.java
index 14d5e2316..ee9b5f62a 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/Builder_ComboRoundTripTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/Builder_ComboRoundTripTest.java
@@ -14,10 +14,17 @@ package org.apache.juneau.transforms;
 
 import static org.apache.juneau.assertions.Verify.*;
 
+import java.lang.reflect.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+
 class Builder_ComboRoundTripTest extends ComboRoundTripTest_Base {
 
+       private static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
+               return ComboRoundTripTester.create(index, label, type, 
()->bean);
+       }
+
        private static ComboRoundTripTester<?>[] TESTERS = {
                tester(1, "A", A.class, new A(null).init())
                        .json("{a:1}")
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64Swap_ComboRoundTripTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64Swap_ComboRoundTripTest.java
index a5e040b04..d1754db55 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64Swap_ComboRoundTripTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64Swap_ComboRoundTripTest.java
@@ -23,14 +23,8 @@ import org.apache.juneau.swaps.*;
 
 class ByteArrayBase64Swap_ComboRoundTripTest extends ComboRoundTripTest_Base {
 
-       protected static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Class<T> type, T bean) {
-               return ComboRoundTripTester.tester(index, label, type, bean)
-                       .serializerApply(s -> 
s.swaps(ByteArraySwap.Base64.class).keepNullProperties())
-                       .parserApply(p -> p.swaps(ByteArraySwap.Base64.class));
-       }
-
-       protected static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
-               return ComboRoundTripTester.tester(index, label, type, bean)
+       private static <T> ComboRoundTripTester.Builder<T> tester(int index, 
String label, Type type, T bean) {
+               return ComboRoundTripTester.create(index, label, type, ()->bean)
                        .serializerApply(s -> 
s.swaps(ByteArraySwap.Base64.class).keepNullProperties())
                        .parserApply(p -> p.swaps(ByteArraySwap.Base64.class));
        }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/ReaderObjectSwap_ComboSerializeTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/ReaderObjectSwap_ComboSerializeTest.java
new file mode 100644
index 000000000..d7e38f499
--- /dev/null
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/ReaderObjectSwap_ComboSerializeTest.java
@@ -0,0 +1,398 @@
+// 
***************************************************************************************************************************
+// * 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.transforms;
+
+import static org.apache.juneau.internal.CollectionUtils.*;
+import static org.apache.juneau.internal.CollectionUtils.list;
+import static org.apache.juneau.utest.utils.Utils2.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.function.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.swap.*;
+
+/**
+ * Verifies that Reader and InputStream objects are serialized correctly.
+ * Note that these are one-way serializations and you're not guaranteed to 
produce parsable output.
+ */
+@SuppressWarnings({})
+public class ReaderObjectSwap_ComboSerializeTest extends 
ComboSerializeTest_Base {
+
+       private static <T> ComboSerializeTester.Builder<T> tester(int index, 
String label, Supplier<T> bean) {
+               return ComboSerializeTester.create(index, label, bean);
+       }
+
+       private static ComboSerializeTester<?>[] TESTERS = {
+               tester(1, "PojoToSimpleReader", PojoToSimpleReader::new)
+                       .json("foo")
+                       .jsonT("foo")
+                       .jsonR("foo")
+                       .xml("foo")
+                       .xmlT("foo")
+                       .xmlR("foo\n")
+                       .xmlNs("foo")
+                       .html("foo")
+                       .htmlT("foo")
+                       .htmlR("foo")
+                       .uon("foo")
+                       .uonT("foo")
+                       .uonR("foo")
+                       .urlEnc("foo")
+                       .urlEncT("foo")
+                       .urlEncR("foo")
+                       .msgPack("666F6F")
+                       .msgPackT("666F6F")
+                       .build(),
+               tester(2, "PojoToDynamicReader", ()->new 
PojoToDynamicReader("foo"))
+                       .json("foo-json5")
+                       .jsonT("foo-json5")
+                       .jsonR("foo-json5")
+                       .xml("foo-xml")
+                       .xmlT("foo-xml")
+                       .xmlR("foo-xml\n")
+                       .xmlNs("foo-xml")
+                       .html("foo-html")
+                       .htmlT("foo-html")
+                       .htmlR("foo-html")
+                       .uon("foo-uon")
+                       .uonT("foo-uon")
+                       .uonR("foo-uon")
+                       .urlEnc("foo-x-www-form-urlencoded")
+                       .urlEncT("foo-x-www-form-urlencoded")
+                       .urlEncR("foo-x-www-form-urlencoded")
+                       .msgPack("666F6F2D6D73677061636B")
+                       .msgPackT("666F6F2D6D73677061636B")
+                       .build(),
+               tester(3, "SometimesSwappedBean1", ()->new 
SometimesSwappedBean1("foo"))
+                       .json("foo-application/json5")
+                       .jsonT("foo-application/json5")
+                       .jsonR("foo-application/json5")
+                       .xml("foo-text/xml")
+                       .xmlT("foo-text/xml")
+                       .xmlR("foo-text/xml\n")
+                       .xmlNs("foo-text/xml")
+                       .html("<table><tr><td>f</td><td>foo</td></tr></table>")
+                       .htmlT("<table><tr><td>f</td><td>foo</td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>foo</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=foo)")
+                       .uonT("(f=foo)")
+                       .uonR("(\n\tf=foo\n)")
+                       .urlEnc("f=foo")
+                       .urlEncT("f=foo")
+                       .urlEncR("f=foo")
+                       .msgPack("81A166A3666F6F")
+                       .msgPackT("81A166A3666F6F")
+                       .build(),
+               tester(4, "SometimesSwappedBean2", ()->new 
SometimesSwappedBean2("foo"))
+                       .json("{f:'foo'}")
+                       .jsonT("{f:'foo'}")
+                       .jsonR("{\n\tf: 'foo'\n}")
+                       .xml("<object><f>foo</f></object>")
+                       .xmlT("<object><f>foo</f></object>")
+                       .xmlR("<object>\n\t<f>foo</f>\n</object>\n")
+                       .xmlNs("<object><f>foo</f></object>")
+                       .html("foo-text/html")
+                       .htmlT("foo-text/html")
+                       .htmlR("foo-text/html")
+                       .uon("foo-text/uon")
+                       .uonT("foo-text/uon")
+                       .uonR("foo-text/uon")
+                       .urlEnc("foo-application/x-www-form-urlencoded")
+                       .urlEncT("foo-application/x-www-form-urlencoded")
+                       .urlEncR("foo-application/x-www-form-urlencoded")
+                       .msgPack("666F6F2D6F6374616C2F6D73677061636B")
+                       .msgPackT("666F6F2D6F6374616C2F6D73677061636B")
+                       .build(),
+               tester(5, "BeanWithSwappedField", ()->new 
BeanWithSwappedField("x"))
+                       .json("{f:x-json5}")
+                       .jsonT("{f:x-json5}")
+                       .jsonR("{\n\tf: x-json5\n}")
+                       .xml("<object><f>x-xml</f></object>")
+                       .xmlT("<object><f>x-xml</f></object>")
+                       .xmlR("<object>\n\t<f>x-xml</f>\n</object>\n")
+                       .xmlNs("<object><f>x-xml</f></object>")
+                       
.html("<table><tr><td>f</td><td>x-html</td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td>x-html</td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>x-html</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=x-uon)")
+                       .uonT("(f=x-uon)")
+                       .uonR("(\n\tf=x-uon\n)")
+                       .urlEnc("f=x-x-www-form-urlencoded")
+                       .urlEncT("f=x-x-www-form-urlencoded")
+                       .urlEncR("f=x-x-www-form-urlencoded")
+                       .msgPack("81A166782D6D73677061636B")
+                       .msgPackT("81A166782D6D73677061636B")
+                       .build(),
+               tester(6, "BeanWithSwapped1dField", ()->new 
BeanWithSwapped1dField("x"))
+                       .json("{f:[x1-json5,x2-json5,null]}")
+                       .jsonT("{f:[x1-json5,x2-json5,null]}")
+                       .jsonR("{\n\tf: 
[\n\t\tx1-json5,\n\t\tx2-json5,\n\t\tnull\n\t]\n}")
+                       .xml("<object><f>x1-xmlx2-xml<null/></f></object>")
+                       .xmlT("<object><f>x1-xmlx2-xml<null/></f></object>")
+                       
.xmlR("<object>\n\t<f>\n\t\tx1-xml\n\t\tx2-xml\n\t\t<null/>\n\t</f>\n</object>\n")
+                       .xmlNs("<object><f>x1-xmlx2-xml<null/></f></object>")
+                       
.html("<table><tr><td>f</td><td><ul><li>x1-html</li><li>x2-html</li><li><null/></li></ul></td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td><ul><li>x1-html</li><li>x2-html</li><li><null/></li></ul></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>x1-html</li>\n\t\t\t\t<li>x2-html</li>\n\t\t\t\t<li><null/></li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=@(x1-uon,x2-uon,null))")
+                       .uonT("(f=@(x1-uon,x2-uon,null))")
+                       
.uonR("(\n\tf=@(\n\t\tx1-uon,\n\t\tx2-uon,\n\t\tnull\n\t)\n)")
+                       
.urlEnc("f=@(x1-x-www-form-urlencoded,x2-x-www-form-urlencoded,null)")
+                       
.urlEncT("f=@(x1-x-www-form-urlencoded,x2-x-www-form-urlencoded,null)")
+                       
.urlEncR("f=@(\n\tx1-x-www-form-urlencoded,\n\tx2-x-www-form-urlencoded,\n\tnull\n)")
+                       
.msgPack("81A1669378312D6D73677061636B78322D6D73677061636BC0")
+                       
.msgPackT("81A1669378312D6D73677061636B78322D6D73677061636BC0")
+                       
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>x1-xml</rdf:li>\n<rdf:li>x2-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+                       
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>x1-xml</rdf:li>\n<rdf:li>x2-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+                       .build(),
+               tester(7, "BeanWithSwappedNullField", 
BeanWithSwappedNullField::new)
+                       .json("{}")
+                       .jsonT("{}")
+                       .jsonR("{\n}")
+                       .xml("<object/>")
+                       .xmlT("<object/>")
+                       .xmlR("<object/>\n")
+                       .xmlNs("<object/>")
+                       .html("<table></table>")
+                       .htmlT("<table></table>")
+                       .htmlR("<table>\n</table>\n")
+                       .uon("()")
+                       .uonT("()")
+                       .uonR("(\n)")
+                       .urlEnc("")
+                       .urlEncT("")
+                       .urlEncR("")
+                       .msgPack("80")
+                       .msgPackT("80")
+                       .build(),
+               tester(8, "BeanWithSwappedListField", ()->new 
BeanWithSwappedListField("x"))
+                       .json("{f:[x1-json5,x2-json5,null]}")
+                       .jsonT("{f:[x1-json5,x2-json5,null]}")
+                       .jsonR("{\n\tf: 
[\n\t\tx1-json5,\n\t\tx2-json5,\n\t\tnull\n\t]\n}")
+                       .xml("<object><f>x1-xmlx2-xml<null/></f></object>")
+                       .xmlT("<object><f>x1-xmlx2-xml<null/></f></object>")
+                       
.xmlR("<object>\n\t<f>\n\t\tx1-xml\n\t\tx2-xml\n\t\t<null/>\n\t</f>\n</object>\n")
+                       .xmlNs("<object><f>x1-xmlx2-xml<null/></f></object>")
+                       
.html("<table><tr><td>f</td><td><ul><li>x1-html</li><li>x2-html</li><li><null/></li></ul></td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td><ul><li>x1-html</li><li>x2-html</li><li><null/></li></ul></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>x1-html</li>\n\t\t\t\t<li>x2-html</li>\n\t\t\t\t<li><null/></li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=@(x1-uon,x2-uon,null))")
+                       .uonT("(f=@(x1-uon,x2-uon,null))")
+                       
.uonR("(\n\tf=@(\n\t\tx1-uon,\n\t\tx2-uon,\n\t\tnull\n\t)\n)")
+                       
.urlEnc("f=@(x1-x-www-form-urlencoded,x2-x-www-form-urlencoded,null)")
+                       
.urlEncT("f=@(x1-x-www-form-urlencoded,x2-x-www-form-urlencoded,null)")
+                       
.urlEncR("f=@(\n\tx1-x-www-form-urlencoded,\n\tx2-x-www-form-urlencoded,\n\tnull\n)")
+                       
.msgPack("81A1669378312D6D73677061636B78322D6D73677061636BC0")
+                       
.msgPackT("81A1669378312D6D73677061636B78322D6D73677061636BC0")
+                       
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>x1-xml</rdf:li>\n<rdf:li>x2-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+                       
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>x1-xml</rdf:li>\n<rdf:li>x2-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+                       .build(),
+               tester(9, "BeanWithSwappedMapField", ()->new 
BeanWithSwappedMapField("x"))
+                       .json("{f:{foo:x1-json5,bar:null,null:x2-json5}}")
+                       .jsonT("{f:{foo:x1-json5,bar:null,null:x2-json5}}")
+                       .jsonR("{\n\tf: {\n\t\tfoo: x1-json5,\n\t\tbar: 
null,\n\t\tnull: x2-json5\n\t}\n}")
+                       .xml("<object><f><foo>x1-xml</foo><bar 
_type='null'/><_x0000_>x2-xml</_x0000_></f></object>")
+                       .xmlT("<object><f><foo>x1-xml</foo><bar 
t='null'/><_x0000_>x2-xml</_x0000_></f></object>")
+                       .xmlR("<object>\n\t<f>\n\t\t<foo>x1-xml</foo>\n\t\t<bar 
_type='null'/>\n\t\t<_x0000_>x2-xml</_x0000_>\n\t</f>\n</object>\n")
+                       .xmlNs("<object><f><foo>x1-xml</foo><bar 
_type='null'/><_x0000_>x2-xml</_x0000_></f></object>")
+                       
.html("<table><tr><td>f</td><td><table><tr><td>foo</td><td>x1-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x2-html</td></tr></table></td></tr></table>")
+                       
.htmlT("<table><tr><td>f</td><td><table><tr><td>foo</td><td>x1-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x2-html</td></tr></table></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>foo</td>\n\t\t\t\t\t<td>x1-html</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>bar</td>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t\t<td>x2-html</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>\n")
+                       .uon("(f=(foo=x1-uon,bar=null,null=x2-uon))")
+                       .uonT("(f=(foo=x1-uon,bar=null,null=x2-uon))")
+                       
.uonR("(\n\tf=(\n\t\tfoo=x1-uon,\n\t\tbar=null,\n\t\tnull=x2-uon\n\t)\n)")
+                       
.urlEnc("f=(foo=x1-x-www-form-urlencoded,bar=null,null=x2-x-www-form-urlencoded)")
+                       
.urlEncT("f=(foo=x1-x-www-form-urlencoded,bar=null,null=x2-x-www-form-urlencoded)")
+                       
.urlEncR("f=(\n\tfoo=x1-x-www-form-urlencoded,\n\tbar=null,\n\tnull=x2-x-www-form-urlencoded\n)")
+                       
.msgPack("81A16683A3666F6F78312D6D73677061636BA3626172C0C078322D6D73677061636B")
+                       
.msgPackT("81A16683A3666F6F78312D6D73677061636BA3626172C0C078322D6D73677061636B")
+                       .rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:parseType='Resource'>\n<jp:foo>x1-xml</jp:foo>\n<jp:bar 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:_x0000_>x2-xml</jp:_x0000_>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+                       .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:parseType='Resource'>\n<jp:foo>x1-xml</jp:foo>\n<jp:bar 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:_x0000_>x2-xml</jp:_x0000_>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+                       .build(),
+               tester(10, "BeanWithListBeanSwappedField", ()->new 
BeanWithListBeanSwappedField("x"))
+                       
.json("{f:[{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}},null]}")
+                       
.jsonT("{f:[{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}},null]}")
+                       .jsonR("{\n\tf: [\n\t\t{\n\t\t\tf1: 
x1a-json5,\n\t\t\tf2: 
[\n\t\t\t\tx2a-json5,\n\t\t\t\tx2b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf4: 
[\n\t\t\t\tx4a-json5,\n\t\t\t\tx4b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf5: 
{\n\t\t\t\tfoo: x5a-json5,\n\t\t\t\tbar: null,\n\t\t\t\tnull: 
x5c-json5\n\t\t\t}\n\t\t},\n\t\tnull\n\t]\n}")
+                       
.xml("<object><f><object><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 _type='null'/><_x0000_>x5c-xml</_x0000_></f5></object><null/></f></object>")
+                       
.xmlT("<object><f><object><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 t='null'/><_x0000_>x5c-xml</_x0000_></f5></object><null/></f></object>")
+                       
.xmlR("<object>\n\t<f>\n\t\t<object>\n\t\t\t<f1>x1a-xml</f1>\n\t\t\t<f2>\n\t\t\t\tx2a-xml\n\t\t\t\tx2b-xml\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f4>\n\t\t\t\tx4a-xml\n\t\t\t\tx4b-xml\n\t\t\t\t<null/>\n\t\t\t</f4>\n\t\t\t<f5>\n\t\t\t\t<foo>x5a-xml</foo>\n\t\t\t\t<bar
 
_type='null'/>\n\t\t\t\t<_x0000_>x5c-xml</_x0000_>\n\t\t\t</f5>\n\t\t</object>\n\t\t<null/>\n\t</f>\n</object>\n")
+                       
.xmlNs("<object><f><object><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 _type='null'/><_x0000_>x5c-xml</_x0000_></f5></object><null/></f></object>")
+                       .html("<table><tr><td>f</td><td><table 
_type='array'><tr><th>f1</th><th>f2</th><th>f3</th><th>f4</th><th>f5</th></tr><tr><td>x1a-html</td><td><ul><li>x2a-html</li><li>x2b-html</li><li><null/></li></ul></td><td><null/></td><td><ul><li>x4a-html</li><li>x4b-html</li><li><null/></li></ul></td><td><table><tr><td>foo</td><td>x5a-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x5c-html</td></tr></table></td></tr><tr><null/></tr></table></td></tr></table>")
+                       .htmlT("<table><tr><td>f</td><td><table 
t='array'><tr><th>f1</th><th>f2</th><th>f3</th><th>f4</th><th>f5</th></tr><tr><td>x1a-html</td><td><ul><li>x2a-html</li><li>x2b-html</li><li><null/></li></ul></td><td><null/></td><td><ul><li>x4a-html</li><li>x4b-html</li><li><null/></li></ul></td><td><table><tr><td>foo</td><td>x5a-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x5c-html</td></tr></table></td></tr><tr><null/></tr></table></td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table 
_type='array'>\n\t\t\t\t<tr>\n\t\t\t\t\t<th>f1</th>\n\t\t\t\t\t<th>f2</th>\n\t\t\t\t\t<th>f3</th>\n\t\t\t\t\t<th>f4</th>\n\t\t\t\t\t<th>f5</th>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>x1a-html</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li>x2a-html</li>\n\t\t\t\t\t\t\t<li>x2b-html</li>\n\t\t\t\t\t\t\t<li><null/></li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t\t<td>\n\t\t\t\t\t
 [...]
+                       
.uon("(f=@((f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon)),null))")
+                       
.uonT("(f=@((f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon)),null))")
+                       
.uonR("(\n\tf=@(\n\t\t(\n\t\t\tf1=x1a-uon,\n\t\t\tf2=@(\n\t\t\t\tx2a-uon,\n\t\t\t\tx2b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf4=@(\n\t\t\t\tx4a-uon,\n\t\t\t\tx4b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t\tfoo=x5a-uon,\n\t\t\t\tbar=null,\n\t\t\t\tnull=x5c-uon\n\t\t\t)\n\t\t),\n\t\tnull\n\t)\n)")
+                       
.urlEnc("f=@((f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)),null)")
+                       
.urlEncT("f=@((f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)),null)")
+                       
.urlEncR("f=@(\n\t(\n\t\tf1=x1a-x-www-form-urlencoded,\n\t\tf2=@(\n\t\t\tx2a-x-www-form-urlencoded,\n\t\t\tx2b-x-www-form-urlencoded,\n\t\t\tnull\n\t\t),\n\t\tf4=@(\n\t\t\tx4a-x-www-form-urlencoded,\n\t\t\tx4b-x-www-form-urlencoded,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=x5a-x-www-form-urlencoded,\n\t\t\tbar=null,\n\t\t\tnull=x5c-x-www-form-urlencoded\n\t\t)\n\t),\n\tnull\n)")
+                       
.msgPack("81A1669284A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636BC0")
+                       
.msgPackT("81A1669284A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636BC0")
+                       
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:f1>x1a-xml</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>x2a-xml</rdf:li>\n<rdf:li>x2b-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>x4a-xml</rdf:li>\n<rdf:li>x4b-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
 rdf:parseType='Resource'>\n<jp: [...]
+                       
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li 
rdf:parseType='Resource'>\n<jp:f1>x1a-xml</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>x2a-xml</rdf:li>\n<rdf:li>x2b-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>x4a-xml</rdf:li>\n<rdf:li>x4b-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
 rdf:parseType='Resource'>\n<jp [...]
+                       .build(),
+               tester(11, "BeanWithMapBeanSwappedField", ()->new 
BeanWithMapBeanSwappedField("x"))
+                       
.json("{f:{foo:{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}},bar:null,null:{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}}}}")
+                       
.jsonT("{f:{foo:{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}},bar:null,null:{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}}}}")
+                       .jsonR("{\n\tf: {\n\t\tfoo: {\n\t\t\tf1: 
x1a-json5,\n\t\t\tf2: 
[\n\t\t\t\tx2a-json5,\n\t\t\t\tx2b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf4: 
[\n\t\t\t\tx4a-json5,\n\t\t\t\tx4b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf5: 
{\n\t\t\t\tfoo: x5a-json5,\n\t\t\t\tbar: null,\n\t\t\t\tnull: 
x5c-json5\n\t\t\t}\n\t\t},\n\t\tbar: null,\n\t\tnull: {\n\t\t\tf1: 
x1a-json5,\n\t\t\tf2: 
[\n\t\t\t\tx2a-json5,\n\t\t\t\tx2b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf4: 
[\n\t\t\t\tx4a-json5,\n\t\t\t\tx4b-json5,\n\ [...]
+                       
.xml("<object><f><foo><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 _type='null'/><_x0000_>x5c-xml</_x0000_></f5></foo><bar 
_type='null'/><_x0000_><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 _type='null'/><_x0000_>x5c-xml</_x0000_></f5></_x0000_></f></object>")
+                       
.xmlT("<object><f><foo><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 t='null'/><_x0000_>x5c-xml</_x0000_></f5></foo><bar 
t='null'/><_x0000_><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 t='null'/><_x0000_>x5c-xml</_x0000_></f5></_x0000_></f></object>")
+                       
.xmlR("<object>\n\t<f>\n\t\t<foo>\n\t\t\t<f1>x1a-xml</f1>\n\t\t\t<f2>\n\t\t\t\tx2a-xml\n\t\t\t\tx2b-xml\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f4>\n\t\t\t\tx4a-xml\n\t\t\t\tx4b-xml\n\t\t\t\t<null/>\n\t\t\t</f4>\n\t\t\t<f5>\n\t\t\t\t<foo>x5a-xml</foo>\n\t\t\t\t<bar
 
_type='null'/>\n\t\t\t\t<_x0000_>x5c-xml</_x0000_>\n\t\t\t</f5>\n\t\t</foo>\n\t\t<bar
 
_type='null'/>\n\t\t<_x0000_>\n\t\t\t<f1>x1a-xml</f1>\n\t\t\t<f2>\n\t\t\t\tx2a-xml\n\t\t\t\tx2b-xml\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f
 [...]
+                       
.xmlNs("<object><f><foo><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 _type='null'/><_x0000_>x5c-xml</_x0000_></f5></foo><bar 
_type='null'/><_x0000_><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
 _type='null'/><_x0000_>x5c-xml</_x0000_></f5></_x0000_></f></object>")
+                       
.html("<table><tr><td>f</td><td><table><tr><td>foo</td><td><table><tr><td>f1</td><td>x1a-html</td></tr><tr><td>f2</td><td><ul><li>x2a-html</li><li>x2b-html</li><li><null/></li></ul></td></tr><tr><td>f4</td><td><ul><li>x4a-html</li><li>x4b-html</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>x5a-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x5c-html</td></tr></table></td></tr></table></td></tr><tr><td>bar</td><td><null/></td
 [...]
+                       
.htmlT("<table><tr><td>f</td><td><table><tr><td>foo</td><td><table><tr><td>f1</td><td>x1a-html</td></tr><tr><td>f2</td><td><ul><li>x2a-html</li><li>x2b-html</li><li><null/></li></ul></td></tr><tr><td>f4</td><td><ul><li>x4a-html</li><li>x4b-html</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>x5a-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x5c-html</td></tr></table></td></tr></table></td></tr><tr><td>bar</td><td><null/></t
 [...]
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>foo</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>f1</td>\n\t\t\t\t\t\t\t\t<td>x1a-html</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>f2</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t<li>x2a-html</li>\n\t\t\t\t\t\t\t\t\t\t<li>x2b-html</li>\n\t\t\t\t\t\t\t\t\t\t<li><null/></li>\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\
 [...]
+                       
.uon("(f=(foo=(f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon)),bar=null,null=(f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon))))")
+                       
.uonT("(f=(foo=(f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon)),bar=null,null=(f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon))))")
+                       
.uonR("(\n\tf=(\n\t\tfoo=(\n\t\t\tf1=x1a-uon,\n\t\t\tf2=@(\n\t\t\t\tx2a-uon,\n\t\t\t\tx2b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf4=@(\n\t\t\t\tx4a-uon,\n\t\t\t\tx4b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t\tfoo=x5a-uon,\n\t\t\t\tbar=null,\n\t\t\t\tnull=x5c-uon\n\t\t\t)\n\t\t),\n\t\tbar=null,\n\t\tnull=(\n\t\t\tf1=x1a-uon,\n\t\t\tf2=@(\n\t\t\t\tx2a-uon,\n\t\t\t\tx2b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf4=@(\n\t\t\t\tx4a-uon,\n\t\t\t\tx4b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n
 [...]
+                       
.urlEnc("f=(foo=(f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)),bar=null,null=(f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)))")
+                       
.urlEncT("f=(foo=(f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)),bar=null,null=(f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlenco
 [...]
+                       
.urlEncR("f=(\n\tfoo=(\n\t\tf1=x1a-x-www-form-urlencoded,\n\t\tf2=@(\n\t\t\tx2a-x-www-form-urlencoded,\n\t\t\tx2b-x-www-form-urlencoded,\n\t\t\tnull\n\t\t),\n\t\tf4=@(\n\t\t\tx4a-x-www-form-urlencoded,\n\t\t\tx4b-x-www-form-urlencoded,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=x5a-x-www-form-urlencoded,\n\t\t\tbar=null,\n\t\t\tnull=x5c-x-www-form-urlencoded\n\t\t)\n\t),\n\tbar=null,\n\tnull=(\n\t\tf1=x1a-x-www-form-urlencoded,\n\t\tf2=@(\n\t\t\tx2a-x-www-form-urlencoded,\n\t\t\tx2b-x-w
 [...]
+                       
.msgPack("81A16683A3666F6F84A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636BA3626172C0C084A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636B")
+                       
.msgPackT("81A16683A3666F6F84A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636BA3626172C0C084A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636B")
+                       .rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:parseType='Resource'>\n<jp:foo 
rdf:parseType='Resource'>\n<jp:f1>x1a-xml</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>x2a-xml</rdf:li>\n<rdf:li>x2b-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>x4a-xml</rdf:li>\n<rdf:li>x4b-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
 rdf:parseType='Re [...]
+                       .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:parseType='Resource'>\n<jp:foo 
rdf:parseType='Resource'>\n<jp:f1>x1a-xml</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>x2a-xml</rdf:li>\n<rdf:li>x2b-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>x4a-xml</rdf:li>\n<rdf:li>x4b-xml</rdf:li>\n<rdf:li
 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
 rdf:parseType='R [...]
+                       .build()
+       };
+
+       static ComboSerializeTester<?>[] testers() {
+               return TESTERS;
+       }
+
+       @Swap(PojoToSimpleReaderSwap.class)
+       public static class PojoToSimpleReader {}
+
+       public static class PojoToSimpleReaderSwap extends 
ObjectSwap<PojoToSimpleReader,Reader> {
+               @Override
+               public Reader swap(BeanSession session, PojoToSimpleReader o) 
throws Exception {
+                       return reader("foo");
+               }
+       }
+
+       @Swap(PojoToDynamicReaderSwap.class)
+       public static class PojoToDynamicReader {
+               private String f;
+               public PojoToDynamicReader(String f) {
+                       this.f = f;
+               }
+       }
+
+       public static class PojoToDynamicReaderSwap extends 
ObjectSwap<PojoToDynamicReader,Object> {
+               @Override
+               public Object swap(BeanSession session, PojoToDynamicReader o) 
throws Exception {
+                       return reader(o.f + "-" + 
session.getMediaType().getSubTypes().get(0));
+               }
+       }
+
+       @Swap(SometimesSwappedBeanSwap1.class)
+       public static class SometimesSwappedBean1 {
+               public String f;
+               public SometimesSwappedBean1(String f) {
+                       this.f = f;
+               }
+       }
+
+       public static class SometimesSwappedBeanSwap1 extends 
ObjectSwap<SometimesSwappedBean1,Object> {
+               @Override
+               public Object swap(BeanSession session, SometimesSwappedBean1 
o) throws Exception {
+                       MediaType mt = session.getMediaType();
+                       if (mt.hasSubType("json5") || mt.hasSubType("xml"))
+                               return reader(o.f + "-" + mt);
+                       return o;
+               }
+       }
+
+       @Swap(SometimesSwappedBeanSwap2.class)
+       public static class SometimesSwappedBean2 {
+               public String f;
+               public SometimesSwappedBean2(String f) {
+                       this.f = f;
+               }
+       }
+
+       public static class SometimesSwappedBeanSwap2 extends 
ObjectSwap<SometimesSwappedBean2,Object> {
+               @Override
+               public Object swap(BeanSession session, SometimesSwappedBean2 
o) throws Exception {
+                       MediaType mt = session.getMediaType();
+                       if (mt.hasSubType("json5") || mt.hasSubType("xml"))
+                               return o;
+                       return reader(o.f + "-" + mt);
+               }
+       }
+
+
+       public static class BeanWithSwappedField {
+               public PojoToDynamicReader f;
+               public BeanWithSwappedField(String f) {
+                       this.f = new PojoToDynamicReader(f);
+               }
+       }
+
+       public static class BeanWithSwapped1dField {
+               public PojoToDynamicReader[] f;
+               public BeanWithSwapped1dField(String f) {
+                       this.f = new PojoToDynamicReader[]{new 
PojoToDynamicReader(f + "1"),new PojoToDynamicReader(f + 2),null};
+               }
+       }
+
+       public static class BeanWithSwappedNullField {
+               public PojoToDynamicReader f;
+       }
+
+       public static class BeanWithSwappedListField {
+               public List<PojoToDynamicReader> f;
+               public BeanWithSwappedListField(String f) {
+                       this.f = list(new PojoToDynamicReader(f + "1"),new 
PojoToDynamicReader(f + "2"),null);
+               }
+       }
+
+       public static class BeanWithSwappedMapField {
+               public Map<String,PojoToDynamicReader> f;
+               public BeanWithSwappedMapField(String f) {
+                       this.f = map("foo",new PojoToDynamicReader(f + 
"1"),"bar",null,null,new PojoToDynamicReader(f + "2"));
+               }
+       }
+
+       public static class BeanWithListBeanSwappedField {
+               public List<B> f;
+               public BeanWithListBeanSwappedField(String f) {
+                       this.f = list(new B(f),null);
+               }
+       }
+
+       public static class BeanWithMapBeanSwappedField {
+               public Map<String,B> f;
+               public BeanWithMapBeanSwappedField(String f) {
+                       this.f = map("foo",new B(f),"bar",null,null,new B(f));
+               }
+       }
+
+       public static class B {
+               public PojoToDynamicReader f1;
+               public PojoToDynamicReader[] f2;
+               public PojoToDynamicReader f3;
+               public List<PojoToDynamicReader> f4;
+               public Map<String,PojoToDynamicReader> f5;
+
+               public B(String f) {
+                       f1 = new PojoToDynamicReader(f + "1a");
+                       f2 = new PojoToDynamicReader[]{new 
PojoToDynamicReader(f + "2a"),new PojoToDynamicReader(f + "2b"),null};
+                       f3 = null;
+                       f4 = list(new PojoToDynamicReader(f + "4a"),new 
PojoToDynamicReader(f + "4b"),null);
+                       f5 = map("foo",new PojoToDynamicReader(f + 
"5a"),"bar",null,null,new PojoToDynamicReader(f + "5c"));
+               }
+       }
+}
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/SwapsAnnotation_ComboSerializeTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/SwapsAnnotation_ComboSerializeTest.java
new file mode 100644
index 000000000..734967935
--- /dev/null
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/SwapsAnnotation_ComboSerializeTest.java
@@ -0,0 +1,733 @@
+// 
***************************************************************************************************************************
+// * 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.transforms;
+
+import static org.apache.juneau.utest.utils.Utils2.*;
+
+import java.util.function.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.swap.*;
+
+/**
+ * Exhaustive serialization tests Swap annotation.
+ */
+class SwapsAnnotation_ComboSerializeTest extends ComboSerializeTest_Base {
+
+       private static <T> ComboSerializeTester.Builder<T> tester(int index, 
String label, Supplier<T> bean) {
+               return ComboSerializeTester.create(index, label, 
bean).serializerApply(s -> s.swaps(
+                               ContextSwap.class,
+                               ContextSwapJson.class,
+                               ContextSwapXml.class,
+                               ContextSwapHtml.class,
+                               ContextSwapUon.class,
+                               ContextSwapUrlEncoding.class,
+                               ContextSwapMsgPack.class,
+                               ContextSwapRdfXml.class
+                       ));
+       }
+
+       private static ComboSerializeTester<?>[] TESTERS = {
+               tester(1, "TestMediaTypeLiterals", TestMediaTypeLiterals::new)
+                       .json("'JSON'")
+                       .jsonT("'JSON'")
+                       .jsonR("'JSON'")
+                       .xml("<string>XML</string>")
+                       .xmlT("<string>XML</string>")
+                       .xmlR("<string>XML</string>\n")
+                       .xmlNs("<string>XML</string>")
+                       .html("<string>HTML</string>")
+                       .htmlT("<string>HTML</string>")
+                       .htmlR("<string>HTML</string>")
+                       .uon("UON")
+                       .uonT("UON")
+                       .uonR("UON")
+                       .urlEnc("_value=URLENCODING")
+                       .urlEncT("_value=URLENCODING")
+                       .urlEncR("_value=URLENCODING")
+                       .msgPack("A74D53475041434B")
+                       .msgPackT("A74D53475041434B")
+                       .build(),
+               tester(2, "TestMediaTypePatterns", TestMediaTypePatterns::new)
+                       .json("'JSON'")
+                       .jsonT("'JSON'")
+                       .jsonR("'JSON'")
+                       .xml("<string>XML</string>")
+                       .xmlT("<string>XML</string>")
+                       .xmlR("<string>XML</string>\n")
+                       .xmlNs("<string>XML</string>")
+                       .html("<string>HTML</string>")
+                       .htmlT("<string>HTML</string>")
+                       .htmlR("<string>HTML</string>")
+                       .uon("UON")
+                       .uonT("UON")
+                       .uonR("UON")
+                       .urlEnc("_value=URLENCODING")
+                       .urlEncT("_value=URLENCODING")
+                       .urlEncR("_value=URLENCODING")
+                       .msgPack("A74D53475041434B")
+                       .msgPackT("A74D53475041434B")
+                       .build(),
+               tester(3, "TestMediaTypePatternsReversed", 
TestMediaTypePatternsReversed::new)
+                       .json("'JSON'")
+                       .jsonT("'JSON'")
+                       .jsonR("'JSON'")
+                       .xml("<string>XML</string>")
+                       .xmlT("<string>XML</string>")
+                       .xmlR("<string>XML</string>\n")
+                       .xmlNs("<string>XML</string>")
+                       .html("<string>HTML</string>")
+                       .htmlT("<string>HTML</string>")
+                       .htmlR("<string>HTML</string>")
+                       .uon("UON")
+                       .uonT("UON")
+                       .uonR("UON")
+                       .urlEnc("_value=URLENCODING")
+                       .urlEncT("_value=URLENCODING")
+                       .urlEncR("_value=URLENCODING")
+                       .msgPack("A74D53475041434B")
+                       .msgPackT("A74D53475041434B")
+                       .build(),
+               tester(4, "TestMediaTypePatternsMulti", 
TestMediaTypePatternsMulti::new)
+                       .json("'JSON'")
+                       .jsonT("'JSON'")
+                       .jsonR("'JSON'")
+                       .xml("<string>XML</string>")
+                       .xmlT("<string>XML</string>")
+                       .xmlR("<string>XML</string>\n")
+                       .xmlNs("<string>XML</string>")
+                       .html("<string>HTML</string>")
+                       .htmlT("<string>HTML</string>")
+                       .htmlR("<string>HTML</string>")
+                       .uon("UON")
+                       .uonT("UON")
+                       .uonR("UON")
+                       .urlEnc("_value=URLENCODING")
+                       .urlEncT("_value=URLENCODING")
+                       .urlEncR("_value=URLENCODING")
+                       .msgPack("A74D53475041434B")
+                       .msgPackT("A74D53475041434B")
+                       .build(),
+               // In this case, "text/xml" should NOT match "text/xml+rdf".
+               tester(5, "TestMediaTypePatternsPartial1", 
TestMediaTypePatternsPartial1::new)
+                       .json("'JSON'")
+                       .jsonT("'JSON'")
+                       .jsonR("'JSON'")
+                       .xml("<string>XML</string>")
+                       .xmlT("<string>XML</string>")
+                       .xmlR("<string>XML</string>\n")
+                       .xmlNs("<string>XML</string>")
+                       .html("<string>HTML</string>")
+                       .htmlT("<string>HTML</string>")
+                       .htmlR("<string>HTML</string>")
+                       .uon("foo")
+                       .uonT("foo")
+                       .uonR("foo")
+                       .urlEnc("_value=foo")
+                       .urlEncT("_value=foo")
+                       .urlEncR("_value=foo")
+                       .msgPack("A3666F6F")
+                       .msgPackT("A3666F6F")
+                       .build(),
+               // In this case, "text/xml+rdf" should NOT match "text/xml".
+               tester(6, "TestMediaTypePatternsPartial2", 
TestMediaTypePatternsPartial2::new)
+                       .json("'foo'")
+                       .jsonT("'foo'")
+                       .jsonR("'foo'")
+                       .xml("<string>foo</string>")
+                       .xmlT("<string>foo</string>")
+                       .xmlR("<string>foo</string>\n")
+                       .xmlNs("<string>foo</string>")
+                       .html("<string>foo</string>")
+                       .htmlT("<string>foo</string>")
+                       .htmlR("<string>foo</string>")
+                       .uon("UON")
+                       .uonT("UON")
+                       .uonR("UON")
+                       .urlEnc("_value=URLENCODING")
+                       .urlEncT("_value=URLENCODING")
+                       .urlEncR("_value=URLENCODING")
+                       .msgPack("A74D53475041434B")
+                       .msgPackT("A74D53475041434B")
+                       .build(),
+               // XML and RDF serializers.
+               tester(7, "TestMediaTypePatternsXmlPlus", 
TestMediaTypePatternsXmlPlus::new)
+                       .json("'foo'")
+                       .jsonT("'foo'")
+                       .jsonR("'foo'")
+                       .xml("<string>XML</string>")
+                       .xmlT("<string>XML</string>")
+                       .xmlR("<string>XML</string>\n")
+                       .xmlNs("<string>XML</string>")
+                       .html("<string>foo</string>")
+                       .htmlT("<string>foo</string>")
+                       .htmlR("<string>foo</string>")
+                       .uon("foo")
+                       .uonT("foo")
+                       .uonR("foo")
+                       .urlEnc("_value=foo")
+                       .urlEncT("_value=foo")
+                       .urlEncR("_value=foo")
+                       .msgPack("A3666F6F")
+                       .msgPackT("A3666F6F")
+                       .build(),
+               // XML and RDF serializers.
+               tester(8, "TestMediaTypePatternsXmlPlusReversed", 
TestMediaTypePatternsXmlPlusReversed::new)
+                       .json("'foo'")
+                       .jsonT("'foo'")
+                       .jsonR("'foo'")
+                       .xml("<string>XML</string>")
+                       .xmlT("<string>XML</string>")
+                       .xmlR("<string>XML</string>\n")
+                       .xmlNs("<string>XML</string>")
+                       .html("<string>foo</string>")
+                       .htmlT("<string>foo</string>")
+                       .htmlR("<string>foo</string>")
+                       .uon("foo")
+                       .uonT("foo")
+                       .uonR("foo")
+                       .urlEnc("_value=foo")
+                       .urlEncT("_value=foo")
+                       .urlEncR("_value=foo")
+                       .msgPack("A3666F6F")
+                       .msgPackT("A3666F6F")
+                       .build(),
+               // RDF serializer.
+               tester(9, "TestMediaTypePatternsRdfPlus", 
TestMediaTypePatternsRdfPlus::new)
+                       .json("'foo'")
+                       .jsonT("'foo'")
+                       .jsonR("'foo'")
+                       .xml("<string>foo</string>")
+                       .xmlT("<string>foo</string>")
+                       .xmlR("<string>foo</string>\n")
+                       .xmlNs("<string>foo</string>")
+                       .html("<string>foo</string>")
+                       .htmlT("<string>foo</string>")
+                       .htmlR("<string>foo</string>")
+                       .uon("foo")
+                       .uonT("foo")
+                       .uonR("foo")
+                       .urlEnc("_value=foo")
+                       .urlEncT("_value=foo")
+                       .urlEncR("_value=foo")
+                       .msgPack("A3666F6F")
+                       .msgPackT("A3666F6F")
+                       .build(),
+               tester(10, "TestTemplate", TestTemplate::new)
+                       .json("foo")
+                       .jsonT("foo")
+                       .jsonR("foo")
+                       .xml("foo")
+                       .xmlT("foo")
+                       .xmlR("foo\n")
+                       .xmlNs("foo")
+                       .html("foo")
+                       .htmlT("foo")
+                       .htmlR("foo")
+                       .uon("foo")
+                       .uonT("foo")
+                       .uonR("foo")
+                       .urlEnc("foo")
+                       .urlEncT("foo")
+                       .urlEncR("foo")
+                       .msgPack("666F6F")
+                       .msgPackT("666F6F")
+                       .build(),
+               tester(11, "TestTemplates", TestTemplates::new)
+                       .json("JSON")
+                       .jsonT("JSON")
+                       .jsonR("JSON")
+                       .xml("XML")
+                       .xmlT("XML")
+                       .xmlR("XML\n")
+                       .xmlNs("XML")
+                       .html("HTML")
+                       .htmlT("HTML")
+                       .htmlR("HTML")
+                       .uon("UON")
+                       .uonT("UON")
+                       .uonR("UON")
+                       .urlEnc("URLENCODING")
+                       .urlEncT("URLENCODING")
+                       .urlEncR("URLENCODING")
+                       .msgPack("4D53475041434B")
+                       .msgPackT("4D53475041434B")
+                       .build(),
+               tester(12, "TestProgrammaticTemplates", 
TestProgrammaticTemplates::new)
+                       .json("JSON")
+                       .jsonT("JSON")
+                       .jsonR("JSON")
+                       .xml("XML")
+                       .xmlT("XML")
+                       .xmlR("XML\n")
+                       .xmlNs("XML")
+                       .html("HTML")
+                       .htmlT("HTML")
+                       .htmlR("HTML")
+                       .uon("UON")
+                       .uonT("UON")
+                       .uonR("UON")
+                       .urlEnc("URLENCODING")
+                       .urlEncT("URLENCODING")
+                       .urlEncR("URLENCODING")
+                       .msgPack("4D53475041434B")
+                       .msgPackT("4D53475041434B")
+                       .build(),
+               tester(13, "TestContextSwap", TestContextSwap::new)
+                       .json("TEMPLATE")
+                       .jsonT("TEMPLATE")
+                       .jsonR("TEMPLATE")
+                       .xml("TEMPLATE")
+                       .xmlT("TEMPLATE")
+                       .xmlR("TEMPLATE\n")
+                       .xmlNs("TEMPLATE")
+                       .html("TEMPLATE")
+                       .htmlT("TEMPLATE")
+                       .htmlR("TEMPLATE")
+                       .uon("TEMPLATE")
+                       .uonT("TEMPLATE")
+                       .uonR("TEMPLATE")
+                       .urlEnc("TEMPLATE")
+                       .urlEncT("TEMPLATE")
+                       .urlEncR("TEMPLATE")
+                       .msgPack("54454D504C415445")
+                       .msgPackT("54454D504C415445")
+                       .build(),
+               tester(14, "TestContextSwaps", TestContextSwaps::new)
+                       .json("JSON")
+                       .jsonT("JSON")
+                       .jsonR("JSON")
+                       .xml("XML")
+                       .xmlT("XML")
+                       .xmlR("XML\n")
+                       .xmlNs("XML")
+                       .html("HTML")
+                       .htmlT("HTML")
+                       .htmlR("HTML")
+                       .uon("UON")
+                       .uonT("UON")
+                       .uonR("UON")
+                       .urlEnc("URLENCODING")
+                       .urlEncT("URLENCODING")
+                       .urlEncR("URLENCODING")
+                       .msgPack("4D53475041434B")
+                       .msgPackT("4D53475041434B")
+                       .build(),
+               tester(15, "BeanA", BeanA::new)
+                       .json("SWAPPED")
+                       .jsonT("SWAPPED")
+                       .jsonR("SWAPPED")
+                       .xml("SWAPPED")
+                       .xmlT("SWAPPED")
+                       .xmlR("SWAPPED\n")
+                       .xmlNs("SWAPPED")
+                       .html("SWAPPED")
+                       .htmlT("SWAPPED")
+                       .htmlR("SWAPPED")
+                       .uon("(f=1)")
+                       .uonT("(f=1)")
+                       .uonR("(\n\tf=1\n)")
+                       .urlEnc("f=1")
+                       .urlEncT("f=1")
+                       .urlEncR("f=1")
+                       .msgPack("81A16601")
+                       .msgPackT("81A16601")
+                       .build(),
+               tester(16, "BeanB", BeanB::new)
+                       .json("{f:1}")
+                       .jsonT("{f:1}")
+                       .jsonR("{\n\tf: 1\n}")
+                       .xml("<object><f>1</f></object>")
+                       .xmlT("<object><f>1</f></object>")
+                       .xmlR("<object>\n\t<f>1</f>\n</object>\n")
+                       .xmlNs("<object><f>1</f></object>")
+                       .html("<table><tr><td>f</td><td>1</td></tr></table>")
+                       .htmlT("<table><tr><td>f</td><td>1</td></tr></table>")
+                       
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>1</td>\n\t</tr>\n</table>\n")
+                       .uon("SWAPPED")
+                       .uonT("SWAPPED")
+                       .uonR("SWAPPED")
+                       .urlEnc("SWAPPED")
+                       .urlEncT("SWAPPED")
+                       .urlEncR("SWAPPED")
+                       .msgPack("53574150504544")
+                       .msgPackT("53574150504544")
+                       .build()
+       };
+
+       static ComboSerializeTester<?>[] testers() {
+               return TESTERS;
+       }
+
+       @Swap(value=SwapJson.class, mediaTypes={"application/json5"})
+       @Swap(value=SwapXml.class, mediaTypes={"text/xml"})
+       @Swap(value=SwapHtml.class, mediaTypes={"text/html"})
+       @Swap(value=SwapUon.class, mediaTypes={"text/uon"})
+       @Swap(value=SwapUrlEncoding.class, 
mediaTypes={"application/x-www-form-urlencoded"})
+       @Swap(value=SwapMsgPack.class, mediaTypes={"octal/msgpack"})
+       @Swap(value=SwapRdfXml.class, mediaTypes={"text/xml+rdf"})
+       public static class TestMediaTypeLiterals {}
+
+       @Swap(value=SwapJson.class, mediaTypes={"*/json5"})
+       @Swap(value=SwapXml.class, mediaTypes={"*/xml"})
+       @Swap(value=SwapHtml.class, mediaTypes={"*/html"})
+       @Swap(value=SwapUon.class, mediaTypes={"*/uon"})
+       @Swap(value=SwapUrlEncoding.class, 
mediaTypes={"*/x-www-form-urlencoded"})
+       @Swap(value=SwapMsgPack.class, mediaTypes={"*/msgpack"})
+       @Swap(value=SwapRdfXml.class, mediaTypes={"*/xml+rdf"})
+       public static class TestMediaTypePatterns {}
+
+       @Swap(value=SwapRdfXml.class, mediaTypes={"*/xml+rdf"})
+       @Swap(value=SwapMsgPack.class, mediaTypes={"*/msgpack"})
+       @Swap(value=SwapUrlEncoding.class, 
mediaTypes={"*/x-www-form-urlencoded"})
+       @Swap(value=SwapUon.class, mediaTypes={"*/uon"})
+       @Swap(value=SwapHtml.class, mediaTypes={"*/html"})
+       @Swap(value=SwapXml.class, mediaTypes={"*/xml"})
+       @Swap(value=SwapJson.class, mediaTypes={"*/json5"})
+       public static class TestMediaTypePatternsReversed {}
+
+       @Swap(value=SwapJson.class, mediaTypes={"*/foo","*/json5","*/bar"})
+       @Swap(value=SwapXml.class, mediaTypes={"*/foo","*/xml","*/bar"})
+       @Swap(value=SwapHtml.class, mediaTypes={"*/foo","*/html","*/bar"})
+       @Swap(value=SwapUon.class, mediaTypes={"*/foo","*/uon","*/bar"})
+       @Swap(value=SwapUrlEncoding.class, 
mediaTypes={"*/foo","*/x-www-form-urlencoded","*/bar"})
+       @Swap(value=SwapMsgPack.class, mediaTypes={"*/foo","*/msgpack","*/bar"})
+       @Swap(value=SwapRdfXml.class, mediaTypes={"*/foo","*/xml+rdf","*/bar"})
+       public static class TestMediaTypePatternsMulti {}
+
+       @Swap(value=SwapJson.class, mediaTypes={"*/foo","*/json5","*/bar"})
+       @Swap(value=SwapXml.class, mediaTypes={"*/foo","*/xml","*/bar"})
+       @Swap(value=SwapHtml.class, mediaTypes={"*/foo","*/html","*/bar"})
+       public static class TestMediaTypePatternsPartial1 {
+               @Override
+               public String toString() {
+                       return "foo";
+               }
+       }
+
+       @Swap(value=SwapUon.class, mediaTypes={"*/foo","*/uon","*/bar"})
+       @Swap(value=SwapUrlEncoding.class, 
mediaTypes={"*/foo","*/x-www-form-urlencoded","*/bar"})
+       @Swap(value=SwapMsgPack.class, mediaTypes={"*/foo","*/msgpack","*/bar"})
+       @Swap(value=SwapRdfXml.class, mediaTypes={"*/foo","*/xml+rdf","*/bar"})
+       public static class TestMediaTypePatternsPartial2 {
+               @Override
+               public String toString() {
+                       return "foo";
+               }
+       }
+
+       @Swap(value=SwapXml.class, mediaTypes={"text/xml+*"})
+       public static class TestMediaTypePatternsXmlPlus {
+               @Override
+               public String toString() {
+                       return "foo";
+               }
+       }
+
+       @Swap(value=SwapXml.class, mediaTypes={"text/*+xml"})
+       public static class TestMediaTypePatternsXmlPlusReversed {
+               @Override
+               public String toString() {
+                       return "foo";
+               }
+       }
+
+       @Swap(value=SwapXml.class, mediaTypes={"text/rdf+*"})
+       public static class TestMediaTypePatternsRdfPlus {
+               @Override
+               public String toString() {
+                       return "foo";
+               }
+       }
+
+       public static class SwapJson extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o) throws 
Exception {
+                       return "JSON";
+               }
+       }
+       public static class SwapXml extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o) throws 
Exception {
+                       return "XML";
+               }
+       }
+       public static class SwapHtml extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o) throws 
Exception {
+                       return "HTML";
+               }
+       }
+       public static class SwapUon extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o) throws 
Exception {
+                       return "UON";
+               }
+       }
+       public static class SwapUrlEncoding extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o) throws 
Exception {
+                       return "URLENCODING";
+               }
+       }
+       public static class SwapMsgPack extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o) throws 
Exception {
+                       return "MSGPACK";
+               }
+       }
+       public static class SwapRdfXml extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o) throws 
Exception {
+                       return "RDFXML";
+               }
+       }
+
+       @Swap(impl=TemplateSwap.class,template="foo")
+       public static class TestTemplate {}
+
+       @Swap(value=TemplateSwap.class, mediaTypes={"*/json5"}, template="JSON")
+       @Swap(value=TemplateSwap.class, mediaTypes={"*/xml"}, template="XML")
+       @Swap(value=TemplateSwap.class, mediaTypes={"*/html"}, template="HTML")
+       @Swap(value=TemplateSwap.class, mediaTypes={"*/uon"}, template="UON")
+       @Swap(value=TemplateSwap.class, mediaTypes={"*/x-www-form-urlencoded"}, 
template="URLENCODING")
+       @Swap(value=TemplateSwap.class, mediaTypes={"*/msgpack"}, 
template="MSGPACK")
+       @Swap(value=TemplateSwap.class, mediaTypes={"*/xml+rdf"}, 
template="RDFXML")
+       public static class TestTemplates {}
+
+
+       public static class TemplateSwap extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o, String 
template) throws Exception {
+                       return reader(template);
+               }
+       }
+
+       @Swap(TemplateSwapJson.class)
+       @Swap(TemplateSwapXml.class)
+       @Swap(TemplateSwapHtml.class)
+       @Swap(TemplateSwapUon.class)
+       @Swap(TemplateSwapUrlEncoding.class)
+       @Swap(TemplateSwapMsgPack.class)
+       @Swap(TemplateSwapRdfXml.class)
+       public static class TestProgrammaticTemplates {}
+
+       public static class TemplateSwapJson extends TemplateSwap {
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/json5");
+               }
+               @Override
+               public String withTemplate() {
+                       return "JSON";
+               }
+       }
+       public static class TemplateSwapXml extends TemplateSwap {
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/xml");
+               }
+               @Override
+               public String withTemplate() {
+                       return "XML";
+               }
+       }
+       public static class TemplateSwapHtml extends TemplateSwap {
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/html");
+               }
+               @Override
+               public String withTemplate() {
+                       return "HTML";
+               }
+       }
+       public static class TemplateSwapUon extends TemplateSwap {
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/uon");
+               }
+               @Override
+               public String withTemplate() {
+                       return "UON";
+               }
+       }
+       public static class TemplateSwapUrlEncoding extends TemplateSwap {
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/x-www-form-urlencoded");
+               }
+               @Override
+               public String withTemplate() {
+                       return "URLENCODING";
+               }
+       }
+       public static class TemplateSwapMsgPack extends TemplateSwap {
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/msgpack");
+               }
+               @Override
+               public String withTemplate() {
+                       return "MSGPACK";
+               }
+       }
+       public static class TemplateSwapRdfXml extends TemplateSwap {
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/xml+rdf");
+               }
+               @Override
+               public String withTemplate() {
+                       return "RDFXML";
+               }
+       }
+
+
+       public static class TestContextSwap {}
+
+       public static class ContextSwap extends 
ObjectSwap<TestContextSwap,Object> {
+               @Override
+               public Object swap(BeanSession session, TestContextSwap o, 
String template) throws Exception {
+                       return reader(template);
+               }
+               @Override
+               public String withTemplate() {
+                       return "TEMPLATE";
+               }
+       }
+
+       public static class TestContextSwaps {}
+
+       public static class ContextSwapJson extends 
ObjectSwap<TestContextSwaps,Object> {
+               @Override
+               public Object swap(BeanSession session, TestContextSwaps o, 
String template) throws Exception {
+                       return reader(template);
+               }
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/json5");
+               }
+               @Override
+               public String withTemplate() {
+                       return "JSON";
+               }
+       }
+       public static class ContextSwapXml extends 
ObjectSwap<TestContextSwaps,Object> {
+               @Override
+               public Object swap(BeanSession session, TestContextSwaps o, 
String template) throws Exception {
+                       return reader(template);
+               }
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/xml");
+               }
+               @Override
+               public String withTemplate() {
+                       return "XML";
+               }
+       }
+       public static class ContextSwapHtml extends 
ObjectSwap<TestContextSwaps,Object> {
+               @Override
+               public Object swap(BeanSession session, TestContextSwaps o, 
String template) throws Exception {
+                       return reader(template);
+               }
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/html");
+               }
+               @Override
+               public String withTemplate() {
+                       return "HTML";
+               }
+       }
+       public static class ContextSwapUon extends 
ObjectSwap<TestContextSwaps,Object> {
+               @Override
+               public Object swap(BeanSession session, TestContextSwaps o, 
String template) throws Exception {
+                       return reader(template);
+               }
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/uon");
+               }
+               @Override
+               public String withTemplate() {
+                       return "UON";
+               }
+       }
+       public static class ContextSwapUrlEncoding extends 
ObjectSwap<TestContextSwaps,Object> {
+               @Override
+               public Object swap(BeanSession session, TestContextSwaps o, 
String template) throws Exception {
+                       return reader(template);
+               }
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/x-www-form-urlencoded");
+               }
+               @Override
+               public String withTemplate() {
+                       return "URLENCODING";
+               }
+       }
+       public static class ContextSwapMsgPack extends 
ObjectSwap<TestContextSwaps,Object> {
+               @Override
+               public Object swap(BeanSession session, TestContextSwaps o, 
String template) throws Exception {
+                       return reader(template);
+               }
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/msgpack");
+               }
+               @Override
+               public String withTemplate() {
+                       return "MSGPACK";
+               }
+       }
+       public static class ContextSwapRdfXml extends 
ObjectSwap<TestContextSwaps,Object> {
+               @Override
+               public Object swap(BeanSession session, TestContextSwaps o, 
String template) throws Exception {
+                       return reader(template);
+               }
+               @Override
+               public MediaType[] forMediaTypes() {
+                       return MediaType.ofAll("*/xml+rdf");
+               }
+               @Override
+               public String withTemplate() {
+                       return "RDFXML";
+               }
+       }
+
+       @Swap(value=BeanSwap.class, mediaTypes={"*/json5"})
+       @Swap(value=BeanSwap.class, mediaTypes={"*/xml"})
+       @Swap(value=BeanSwap.class, mediaTypes={"*/html"})
+       public static class BeanA {
+               public int f = 1;
+       }
+
+       @Swap(value=BeanSwap.class, mediaTypes={"*/uon"})
+       @Swap(value=BeanSwap.class, mediaTypes={"*/x-www-form-urlencoded"})
+       @Swap(value=BeanSwap.class, mediaTypes={"*/msgpack"})
+       @Swap(value=BeanSwap.class, mediaTypes={"*/xml+rdf"})
+       public static class BeanB {
+               public int f = 1;
+       }
+
+       public static class BeanSwap extends ObjectSwap<Object,Object> {
+               @Override
+               public Object swap(BeanSession session, Object o, String 
template) throws Exception {
+                       return reader("SWAPPED");
+               }
+       }
+}
\ No newline at end of file

Reply via email to