diff --git a/src/factory/PVUnion.cpp b/src/factory/PVUnion.cpp index 65111eb..9848cb7 100644 --- a/src/factory/PVUnion.cpp +++ b/src/factory/PVUnion.cpp @@ -169,7 +169,9 @@ void PVUnion::deserialize(ByteBuffer *pbuffer, DeserializableControl *pcontrol) FieldConstPtr field = pcontrol->cachedDeserialize(pbuffer); if (field.get()) { - value = getPVDataCreate()->createPVField(field); + // try to reuse existing field instance + if (!value.get() || *value->getField() != *field) + value = getPVDataCreate()->createPVField(field); value->deserialize(pbuffer, pcontrol); } else @@ -177,11 +179,17 @@ void PVUnion::deserialize(ByteBuffer *pbuffer, DeserializableControl *pcontrol) } else { + int32 previousSelector = selector; selector = static_cast(SerializeHelper::readSize(pbuffer, pcontrol)); if (selector != UNDEFINED_INDEX) { - FieldConstPtr field = unionPtr->getField(selector); - value = getPVDataCreate()->createPVField(field); + if (selector != previousSelector) + { + FieldConstPtr field = unionPtr->getField(selector); + // try to reuse existing field instance + if (!value.get() || *value->getField() != *field) + value = getPVDataCreate()->createPVField(field); + } value->deserialize(pbuffer, pcontrol); } else