多年来,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更新:我尝试过向JRE参数添加-非法访问=许可-没有改变行为。如果我设置为非法访问=拒绝,那么xstream在更早的时候就会失败,所以我非常确信--非法访问=许可是活动设置。
发布于 2019-07-01 18:08:34
如果其他人遇到这样的情况:
解决方案是将PCL成员变量标记为瞬态(并设置关联的readResolve来初始化值)。
接下来,我们在持久性代理类的反序列化方面遇到了问题(代理的成员变量中没有一个被填充)--看来,对于后期版本的XStream,在持久性代理上需要一个零arg构造函数。一旦我添加了零arg构造函数,事情就又开始工作了。
https://stackoverflow.com/questions/56711414
复制相似问题