diff --git a/platform/configuration-store-impl/src/SaveSessionBase.kt b/platform/configuration-store-impl/src/SaveSessionBase.kt index 504a6b0387e1..5f7214235d93 100644 --- a/platform/configuration-store-impl/src/SaveSessionBase.kt +++ b/platform/configuration-store-impl/src/SaveSessionBase.kt @@ -19,30 +19,16 @@ import com.intellij.openapi.components.StateStorage import com.intellij.openapi.util.JDOMExternalizable import com.intellij.openapi.util.WriteExternalException import com.intellij.openapi.vfs.SafeWriteRequestor +import com.intellij.reference.SoftReference import com.intellij.util.xmlb.SkipDefaultsSerializationFilter import com.intellij.util.xmlb.XmlSerializer import org.jdom.Element abstract class SaveSessionBase : StateStorage.SaveSession, StateStorage.ExternalizationSession, SafeWriteRequestor { - private var serializationFilter: SkipDefaultsSerializationFilter? = null - - @SuppressWarnings("deprecation") - override fun setState(component: Any, componentName: String, state: Any) { + override final fun setState(component: Any, componentName: String, state: Any) { val element: Element? try { - if (state is Element) { - element = state - } - else if (state is JDOMExternalizable) { - element = Element("temp_element") - state.writeExternal(element) - } - else { - if (serializationFilter == null) { - serializationFilter = SkipDefaultsSerializationFilter() - } - element = XmlSerializer.serializeIfNotDefault(state, serializationFilter) - } + element = serializeState(state) } catch (e: WriteExternalException) { LOG.debug(e) @@ -58,3 +44,24 @@ abstract class SaveSessionBase : StateStorage.SaveSession, StateStorage.External protected abstract fun setSerializedState(component: Any, componentName: String, element: Element?) } + +private val skipDefaultsSerializationFilter = ThreadLocal>() + +fun serializeState(state: Any): Element? { + if (state is Element) { + return state + } + else if (state is JDOMExternalizable) { + val element = Element("temp_element") + state.writeExternal(element) + return element + } + else { + var serializationFilter = SoftReference.dereference(skipDefaultsSerializationFilter.get()) + if (serializationFilter == null) { + serializationFilter = SkipDefaultsSerializationFilter() + skipDefaultsSerializationFilter.set(SoftReference(serializationFilter)) + } + return XmlSerializer.serializeIfNotDefault(state, serializationFilter) + } +}