diff --git a/platform/util/src/com/intellij/util/xmlb/AbstractCollectionBinding.java b/platform/util/src/com/intellij/util/xmlb/AbstractCollectionBinding.java index 96793383561e..e3a0b7a2579b 100644 --- a/platform/util/src/com/intellij/util/xmlb/AbstractCollectionBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/AbstractCollectionBinding.java @@ -146,13 +146,23 @@ abstract class AbstractCollectionBinding implements Binding { public Object deserialize(Object o, @NotNull Object... nodes) { Collection result; if (getTagName(o) == null) { - result = new SmartList(); + if (o instanceof Collection) { + result = (Collection)o; + result.clear(); + } + else { + result = new SmartList(); + } for (Object node : nodes) { if (!XmlSerializerImpl.isIgnoredNode(node)) { //noinspection unchecked result.add(getElementBinding(node).deserialize(o, node)); } } + + if (result == o) { + return result; + } } else { assert nodes.length == 1; diff --git a/platform/util/src/com/intellij/util/xmlb/AccessorBindingWrapper.java b/platform/util/src/com/intellij/util/xmlb/AccessorBindingWrapper.java index 4adc380b2192..e071b6b915ec 100644 --- a/platform/util/src/com/intellij/util/xmlb/AccessorBindingWrapper.java +++ b/platform/util/src/com/intellij/util/xmlb/AccessorBindingWrapper.java @@ -40,7 +40,11 @@ class AccessorBindingWrapper implements Binding { @Override @Nullable public Object deserialize(Object context, @NotNull Object... nodes) { - myAccessor.write(context, myBinding.deserialize(myAccessor.read(context), nodes)); + Object currentValue = myAccessor.read(context); + Object deserializedValue = myBinding.deserialize(currentValue, nodes); + if (currentValue != deserializedValue) { + myAccessor.write(context, deserializedValue); + } return context; }