Index: src/java/com/thoughtworks/xstream/XStream.java =================================================================== --- src/java/com/thoughtworks/xstream/XStream.java (revision 1691) +++ src/java/com/thoughtworks/xstream/XStream.java (working copy) @@ -638,7 +638,11 @@ registerConverter(new MapConverter(mapper), PRIORITY_NORMAL); registerConverter(new TreeMapConverter(mapper), PRIORITY_NORMAL); registerConverter(new TreeSetConverter(mapper), PRIORITY_NORMAL); - registerConverter(new PropertiesConverter(), PRIORITY_NORMAL); + + if (!jvm.isAppEngine()) { + registerConverter(new PropertiesConverter(), PRIORITY_NORMAL); + } + registerConverter(new EncodedByteArrayConverter(), PRIORITY_NORMAL); registerConverter(new FileConverter(), PRIORITY_NORMAL); @@ -696,12 +700,16 @@ dynamicallyRegisterConverter( "com.thoughtworks.xstream.converters.enums.EnumConverter", PRIORITY_NORMAL, null, null); - dynamicallyRegisterConverter( - "com.thoughtworks.xstream.converters.enums.EnumSetConverter", PRIORITY_NORMAL, - new Class[]{Mapper.class}, new Object[]{mapper}); - dynamicallyRegisterConverter( - "com.thoughtworks.xstream.converters.enums.EnumMapConverter", PRIORITY_NORMAL, - new Class[]{Mapper.class}, new Object[]{mapper}); + + if (!jvm.isAppEngine()) { + dynamicallyRegisterConverter( + "com.thoughtworks.xstream.converters.enums.EnumSetConverter", PRIORITY_NORMAL, + new Class[]{Mapper.class}, new Object[]{mapper}); + dynamicallyRegisterConverter( + "com.thoughtworks.xstream.converters.enums.EnumMapConverter", PRIORITY_NORMAL, + new Class[]{Mapper.class}, new Object[]{mapper}); + } + dynamicallyRegisterConverter( "com.thoughtworks.xstream.converters.basic.StringBuilderConverter", PRIORITY_NORMAL, null, null); Index: src/java/com/thoughtworks/xstream/core/JVM.java =================================================================== --- src/java/com/thoughtworks/xstream/core/JVM.java (revision 1691) +++ src/java/com/thoughtworks/xstream/core/JVM.java (working copy) @@ -26,9 +26,10 @@ private ReflectionProvider reflectionProvider; private transient Map loaderCache = new HashMap(); - private final boolean supportsAWT = loadClass("java.awt.Color") != null; - private final boolean supportsSwing = loadClass("javax.swing.LookAndFeel") != null; - private final boolean supportsSQL = loadClass("java.sql.Date") != null; + private final boolean isAppEngine = loadClass("com.google.appengine.api.datastore.DatastoreService") != null; + private final boolean supportsAWT = (loadClass("java.awt.Color") != null) && (!isAppEngine); + private final boolean supportsSwing = (loadClass("javax.swing.LookAndFeel") != null) && (!isAppEngine); + private final boolean supportsSQL = loadClass("java.sql.Date") != null; private static final String vendor = System.getProperty("java.vm.vendor"); private static final float majorJavaVersion = getMajorJavaVersion(); @@ -63,6 +64,10 @@ return majorJavaVersion >= 1.6f; } + public boolean isAppEngine() { + return isAppEngine; + } + private static boolean isSun() { return vendor.indexOf("Sun") != -1; } @@ -185,7 +190,7 @@ return reflectionProvider; } - private boolean canUseSun14ReflectionProvider() { + public boolean canUseSun14ReflectionProvider() { return (isSun() || isApple() || isHPUX() @@ -196,6 +201,7 @@ || isSAP() || isDiablo()) && is14() + && (!isAppEngine()) && loadClass("sun.misc.Unsafe") != null; } @@ -262,5 +268,6 @@ System.out.println("Supports Swing: " + jvm.supportsSwing()); System.out.println("Supports SQL: " + jvm.supportsSQL()); System.out.println("Reverse field order detected (may have failed): " + reverse); + System.out.println("Google App Engine: " + jvm.isAppEngine()); } }