Can't serialize instance of class, Caused by: IllegalArgumentException: wrong number of arguments

已回答

I'm writing a class which implemets PersistentStateCompontent, trying to make a custom List of RunnerAndConfigurationSettings persistent. This class is implemented like the following:

@State(name = "SettingsProvider", storages = @Storage("settingsProvider.xml"))
public class SettingsProvider implements PersistentStateComponent<SettingsProvider.State> {
public final State myState = new State();

public static final SettingsProvider getInstance() {
return ServiceManager.getService(SettingsProvider.class);
}

public static final class State {
public List<RunnerAndConfigurationSettings> configSettings;

public State() {
configSettings = new ArrayList<>();
}

@Override
public boolean equals(Object obj) {
if(!(obj instanceof SettingsProvider.State)) return false;

return ((State) obj).configSettings == this.configSettings;
}
}

@Nullable
@Override
public SettingsProvider.State getState() {
return myState;
}

@Override
public void loadState(@NotNull State state) {
XmlSerializerUtil.copyBean(state, myState);
}

public List<RunnerAndConfigurationSettings> getConfigSettings() {
return myState.configSettings;
}

public void setConfigSettings(List<RunnerAndConfigurationSettings> configSettings) {
myState.configSettings = configSettings;
}
}

And the relevant part of my plugin.xml:

<extensions defaultExtensionNs="com.intellij">
<applicationService serviceImplementation="com.luke.switchrunconfig.SettingsProvider"
serviceInterface="com.luke.switchrunconfig.SettingsProvider"/>
</extensions>

And I always get the follwing Error

2020-05-10 15:45:26,196 [  76862]  ERROR - rationStore.ComponentStoreImpl - Unable to serialize SettingsProvider state 
com.intellij.util.xmlb.XmlSerializationException: Can't serialize instance of class com.luke.switchrunconfig.SettingsProvider$State
at com.intellij.configurationStore.JdomSerializerImpl.serialize(xmlSerializer.kt:59)
at com.intellij.configurationStore.XmlSerializer.serialize(xmlSerializer.kt:19)
at com.intellij.configurationStore.XmlSerializer.serialize$default(xmlSerializer.kt:18)
at com.intellij.configurationStore.SaveSessionBaseKt.serializeState(SaveSessionBase.kt:46)
at com.intellij.configurationStore.SaveSessionBase.setState(SaveSessionBase.kt:20)
at com.intellij.configurationStore.ComponentStoreImpl.setStateToSaveSessionProducer(ComponentStoreImpl.kt:316)
at com.intellij.configurationStore.ComponentStoreImpl.commitComponent(ComponentStoreImpl.kt:309)
at com.intellij.configurationStore.ComponentStoreImpl.commitComponents$intellij_platform_configurationStore_impl(ComponentStoreImpl.kt:216)
at com.intellij.configurationStore.ComponentStoreWithExtraComponents.commitComponents$intellij_platform_configurationStore_impl(ComponentStoreWithExtraComponents.kt:90)
at com.intellij.configurationStore.ComponentStoreImpl$commitComponentsOnEdt$$inlined$withEdtContext$intellij_platform_configurationStore_impl$1.invokeSuspend(ComponentStoreImpl.kt:695)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
at com.intellij.configurationStore.EdtPoolDispatcherManager.processQueue(EdtPoolDispatcher.kt:54)
at com.intellij.configurationStore.EdtPoolDispatcherManager.access$processQueue(EdtPoolDispatcher.kt:18)
at com.intellij.configurationStore.EdtPoolDispatcherManager$scheduleFlush$1.invoke(EdtPoolDispatcher.kt:32)
at com.intellij.configurationStore.EdtPoolDispatcherManager$scheduleFlush$1.invoke(EdtPoolDispatcher.kt:18)
at com.intellij.configurationStore.EdtPoolDispatcherKt$sam$java_lang_Runnable$0.run(EdtPoolDispatcher.kt)
at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:201)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:310)
at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:80)
at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:128)
at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46)
at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:184)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:847)
at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:730)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:496)
at com.intellij.ide.IdeEventQueue.pumpEventsForHierarchy(IdeEventQueue.java:1030)
at com.intellij.openapi.progress.util.ProgressWindow.pumpEventsForHierarchy(ProgressWindow.java:199)
at com.intellij.openapi.progress.util.ProgressWindow.lambda$startBlocking$3(ProgressWindow.java:189)
at com.intellij.openapi.application.impl.ApplicationImpl.runUnlockingIntendedWrite(ApplicationImpl.java:857)
at com.intellij.openapi.progress.util.ProgressWindow.startBlocking(ProgressWindow.java:188)
at com.intellij.openapi.progress.impl.ProgressRunner.lambda$legacyExec$6(ProgressRunner.java:302)
at java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:753)
at java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:731)
at java.base/java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2108)
at com.intellij.openapi.progress.impl.ProgressRunner.legacyExec(ProgressRunner.java:300)
at com.intellij.openapi.progress.impl.ProgressRunner.submit(ProgressRunner.java:248)
at com.intellij.openapi.progress.impl.ProgressRunner.submitAndGet(ProgressRunner.java:169)
at com.intellij.openapi.application.impl.ApplicationImpl.runProcessWithProgressSynchronously(ApplicationImpl.java:426)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcessWithProgressSynchronously(CoreProgressManager.java:494)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcessWithProgressSynchronously(ProgressManagerImpl.java:84)
at com.intellij.openapi.progress.impl.CoreProgressManager.runSynchronously(CoreProgressManager.java:345)
at com.intellij.openapi.progress.impl.CoreProgressManager.run(CoreProgressManager.java:330)
at com.intellij.configurationStore.SaveAndSyncHandlerImpl.saveSettingsUnderModalProgress(SaveAndSyncHandlerImpl.kt:214)
at com.intellij.openapi.application.impl.ApplicationImpl.doExit(ApplicationImpl.java:618)
at com.intellij.openapi.application.impl.ApplicationImpl.exit(ApplicationImpl.java:589)
at com.intellij.openapi.application.impl.ApplicationImpl.exit(ApplicationImpl.java:578)
at com.intellij.openapi.application.ex.ApplicationEx.exit(ApplicationEx.java:85)
at com.intellij.openapi.wm.impl.CloseProjectWindowHelper.quitApp(CloseProjectWindowHelper.kt:57)
at com.intellij.openapi.wm.impl.CloseProjectWindowHelper.windowClosing(CloseProjectWindowHelper.kt:35)
at com.intellij.openapi.wm.impl.ProjectFrameHelper$2.windowClosing(ProjectFrameHelper.java:231)
at java.desktop/java.awt.AWTEventMulticaster.windowClosing(AWTEventMulticaster.java:357)
at java.desktop/java.awt.AWTEventMulticaster.windowClosing(AWTEventMulticaster.java:357)
at java.desktop/java.awt.Window.processWindowEvent(Window.java:2079)
at java.desktop/javax.swing.JFrame.processWindowEvent(JFrame.java:298)
at java.desktop/java.awt.Window.processEvent(Window.java:2038)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomHeader.close(CustomHeader.kt:237)
at com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomHeader$myCloseAction$1.invoke(CustomHeader.kt:234)
at com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomHeader$myCloseAction$1.invoke(CustomHeader.kt:38)
at com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomHeader$CustomFrameAction.actionPerformed(CustomHeader.kt:244)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:270)
at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6651)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
at java.desktop/java.awt.Component.processEvent(Component.java:6416)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:912)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:844)
at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:741)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.IllegalArgumentException: wrong number of arguments
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at com.intellij.util.ReflectionUtil.createAsDataClass(ReflectionUtil.java:507)
at com.intellij.util.ReflectionUtil.newInstance(ReflectionUtil.java:443)
at com.intellij.util.ReflectionUtil.newInstance(ReflectionUtil.java:417)
at com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters.getDefaultValue(SkipDefaultValuesSerializationFilters.java:54)
at com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters.getDefaultBean(SkipDefaultValuesSerializationFilters.java:46)
at com.intellij.util.xmlb.SkipDefaultsSerializationFilter.equal(SkipDefaultsSerializationFilter.java:32)
at com.intellij.util.xmlb.BeanBinding.serializePropertyInto(BeanBinding.java:92)
at com.intellij.util.xmlb.BeanBinding.serializeInto(BeanBinding.java:77)
at com.intellij.serialization.xml.KotlinAwareBeanBinding.serializeInto(KotlinAwareBeanBinding.kt:38)
at com.intellij.util.xmlb.BeanBinding.serialize(BeanBinding.java:64)
at com.intellij.util.xmlb.AbstractCollectionBinding.serializeItem(AbstractCollectionBinding.java:208)
at com.intellij.util.xmlb.AbstractCollectionBinding.serialize(AbstractCollectionBinding.java:145)
at com.intellij.util.xmlb.OptionTagBinding.serialize(OptionTagBinding.java:64)
at com.intellij.util.xmlb.BasePrimitiveBinding.serialize(BasePrimitiveBinding.java:47)
at com.intellij.util.xmlb.BeanBinding.serializePropertyInto(BeanBinding.java:112)
at com.intellij.util.xmlb.BeanBinding.serializeInto(BeanBinding.java:77)
at com.intellij.serialization.xml.KotlinAwareBeanBinding.serializeInto(KotlinAwareBeanBinding.kt:38)
at com.intellij.util.xmlb.BeanBinding.serialize(BeanBinding.java:68)
at com.intellij.configurationStore.JdomSerializerImpl.serialize(xmlSerializer.kt:49)
... 119 more
2020-05-10 15:45:26,203 [ 76869] ERROR - rationStore.ComponentStoreImpl - IntelliJ IDEA 2020.1.1 Build #IC-201.7223.91
2020-05-10 15:45:26,203 [ 76869] ERROR - rationStore.ComponentStoreImpl - JDK: 11.0.6; VM: OpenJDK 64-Bit Server VM; Vendor: JetBrains s.r.o
2020-05-10 15:45:26,204 [ 76870] ERROR - rationStore.ComponentStoreImpl - OS: Windows 10
2020-05-10 15:45:26,205 [ 76871] ERROR - rationStore.ComponentStoreImpl - Last Action: SwitchRunConfig.Actions.SwitchConfigSettings
2020-05-10 15:45:26,557 [ 77223] WARN - com.intellij.util.xmlb.Binding - no accessors for class org.jetbrains.kotlin.idea.core.script.configuration.utils.ScriptClassRootsStorage
Caused by: java.lang.IllegalArgumentException: wrong number of arguments
 
0

Try changing this method to:

@Override
public void loadState(@NotNull SettingsProvider state) {
XmlSerializerUtil.copyBean(state, this);
}

Class declaration can just be:

public class SettingsProvider implements PersistentStateComponent<SettingsProvider> {}

 

0

I still get the same Error message

My class now looks like this:

@State(name = "SettingsProvider", storages = @Storage("settingsProvider.xml"))
public class SettingsProvider implements PersistentStateComponent<SettingsProvider> {
public List<RunnerAndConfigurationSettings> configSettings;

public SettingsProvider() {
configSettings = new ArrayList<>();
}

public static final SettingsProvider getInstance() {
return ServiceManager.getService(SettingsProvider.class);
}

@Nullable
@Override
public SettingsProvider getState() {
return this;
}

@Override
public void loadState(@NotNull SettingsProvider state) {
XmlSerializerUtil.copyBean(state, this);
}

public List<RunnerAndConfigurationSettings> getConfigSettings() {
return configSettings;
}

public void setConfigSettings(List<RunnerAndConfigurationSettings> configSettings) {
this.configSettings = configSettings;
}
}
0

Here is my implementation that I use, all state that is persisted is stored in the fields of the PersistentStateComponent.

@State(
name = "SettingsService",
storages = {
@Storage("settingsService.xml")
}
)
public class SettingsService implements PersistentStateComponent<SettingsService> {
public Boolean firstSetting;
public Boolean secondSetting;
public Boolean thirdSetting;

public static SettingsService getInstance() {
return ServiceManager.getService(SettingsService.class);
}

@Nullable
@Override
public SettingsService getState() {
return this;
}

@Override
public void loadState(@NotNull SettingsService state) {

XmlSerializerUtil.copyBean(state, this);
}


}
0

Well, this looks pretty similar to mine. During trial and error I found out that I don't get this error, when I only try to serialize for example Strings. So the reason might be that the Interface RunnerAndConfigurationSettings is not serializable.

I'll try and write my own implementation for serializing this

1

请先登录再写评论。