Error when deserializing XStream XML in Java 11 - Cannot create java.beans.PropertyChangeSupport by JDK serialization : null

Viewed 1684

We have a large number of data files created by XStream over the years. Under Java 11, these files will no longer deserialize.

It appears that the issue is the inclusion of PropertChangeListener as a serialized instance member.

I suspect this has something to do with Java 9+ module restrictions, etc... Any guidance on how we can make things work properly under Java 11?

Here's an example of the XML:

<com.package.Config>
<changeSupport serialization="custom">
    <java.beans.PropertyChangeSupport>
      <default>
        <source class="com.package.Config" reference="../../../.."/>
        <propertyChangeSupportSerializedDataVersion>2</propertyChangeSupportSerializedDataVersion>
      </default>
      <null/>
    </java.beans.PropertyChangeSupport>
  </changeSupport>
  <extractors resolves-to="com.package.textextraction.Extractors$Persit_1_0_0">
    <myExtractors>
      <entry>
        <string>test</string>
        <com.package.textextraction.RegExExtractor resolves-to="com.package.textextraction.RegExExtractor$Persist_1_0_0">
          <name>test</name>
          <strpattern>.*</strpattern>
          <translateurl></translateurl>
          <translatequery></translatequery>
          <matchnum>1</matchnum>
          <emptyStringIfNoMatch>false</emptyStringIfNoMatch>
        </com.package.textextraction.RegExExtractor>
      </entry>
    </myExtractors>
  </extractors>
  <name>test</name>
  <attributePatterns/>
</com.package.netdocspublisher2.NDAutoFilerConfig>

Here's the stack trace (sorry for the length, but I suspect the entire thing may be of use):

com.thoughtworks.xstream.converters.ConversionException: Cannot create java.beans.PropertyChangeSupport by JDK serialization : null : Cannot create java.beans.PropertyChangeSupport by JDK serialization : null
---- Debugging information ----
message             : Cannot create java.beans.PropertyChangeSupport by JDK serialization : null
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Cannot create java.beans.PropertyChangeSupport by JDK serialization : null
class               : java.beans.PropertyChangeSupport
required-type       : java.beans.PropertyChangeSupport
converter-type      : com.thoughtworks.xstream.converters.reflection.SerializableConverter
path                : /com.package.NDAutoFilerConfig/changeSupport
line number         : 2
class[1]            : com.package.NDAutoFilerConfig
converter-type[1]   : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
version             : null
-------------------------------
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1052)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:921)
    at com.package.appframeworkext.storage.XStreamPersistenceStrategy.deserialize(XStreamPersistenceStrategy.java:50)
    ... 10 more
Caused by: com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Cannot create java.beans.PropertyChangeSupport by JDK serialization : null
    at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.instantiateUsingSerialization(PureJavaReflectionProvider.java:119)
    at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.newInstance(PureJavaReflectionProvider.java:69)
    at com.thoughtworks.xstream.converters.reflection.ReflectionProviderWrapper.newInstance(ReflectionProviderWrapper.java:42)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:428)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:233)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
    ... 25 more
Caused by: java.io.OptionalDataException
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1555)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
    at java.desktop/java.beans.PropertyChangeSupport.readObject(PropertyChangeSupport.java:476)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1160)
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2216)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
    at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.instantiateUsingSerialization(PureJavaReflectionProvider.java:116)
    ... 30 more

Update: I've tried adding --illegal-access=permit to the JRE arguments, no change in behavior. If I set -illegal-access=deny, then xstream fails much earlier, so I'm pretty confident that --illegal-access=permit is the active setting.

1 Answers

In case anyone else runs into this:

The solution was to mark the PCL member variable as transient (and set up associated readResolve to initialize the value).

Next, we had problems with deserialization of a persistence proxy class (none of the member variables of the proxy were being populated) - it appears that with later versions of Java, XStream requires a zero arg constructor on persistence proxies. Once I added the zero arg constructor, things started working again.

Related