java - 在 Java 11 中反序列化 XStream XML 时出错 - 无法通过 JDK 序列化创建 java.beans.PropertyChangeSupport : null

标签 java xstream java-11 java-module

多年来,我们拥有大量由 XStream 创建的数据文件。在 Java 11 下,这些文件将不再反序列化。

问题似乎是将 PropertChangeListener 作为序列化实例成员包含在内。

我怀疑这与 Java 9+ 模块限制等有关......关于我们如何使事情在 Java 11 下正常工作的任何指导?

这是一个 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>

这是堆栈跟踪(抱歉,长度太长,但我怀疑整个事情可能有用):

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

更新:我已经尝试将 --illegal-access=permit 添加到 JRE 参数中,但行为没有变化。如果我设置 -illegal-access=deny,那么 xstream 会更早失败,所以我非常有信心 --illegal-access=permit 是 Activity 设置。

最佳答案

万一其他人遇到这个:

解决方案是将 PCL 成员变量标记为 transient (并设置关联的 readResolve 以初始化该值)。

接下来,我们在持久代理类的反序列化方面遇到了问题(代理的所有成员变量都没有被填充)——似乎对于更高版本的 Java,XStream 需要持久代理上的零参数构造函数。添加零 arg 构造函数后,事情又开始工作了。

关于java - 在 Java 11 中反序列化 XStream XML 时出错 - 无法通过 JDK 序列化创建 java.beans.PropertyChangeSupport : null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56711414/

相关文章:

java - XStream Java 对象到 XML 跳过一些字段

java - Python 生成的 XML 中的错误

Java 11 标准环境与 ApiProxy 不兼容?

gradle - 缺少 JavaFX 应用程序类 com.MainApp

java - 从 JDK8 升级到 JDK11 后奇怪的 java.lang.InstantiationException 和 java.lang.NoSuchMethodException

java - 带有样本 "guest"数据的 Web 应用程序

java - 如何过滤来自 Firebase 的查询?

java - java.time 的 Spring DateTimeFormat 配置

java - Eclipse 'generate entities from tables' 和 'many to one' 关系

类似于 XSTREAM 的 C++ 序列化清理 XML