diff -u b/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php --- b/core/lib/Drupal/Core/Entity/ContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php @@ -153,7 +153,7 @@ * * @var bool */ - public $serializeFields = FALSE; + public $serializeComputedFieldValues = FALSE; /** * {@inheritdoc} @@ -417,14 +417,20 @@ * {@inheritdoc} */ public function __sleep() { + if ($this->serializeComputedFieldValues) { + foreach ($this->referencedEntities() as $entity) { + if ($entity instanceof ContentEntityInterface) { + $entity->serializeComputedFieldValues = TRUE; + } + } + } // Get the values of instantiated field objects, only serialize the values. foreach ($this->fields as $name => $fields) { foreach ($fields as $langcode => $field) { - $this->values[$name][$langcode] = $field->getValue(); + $this->values[$name][$langcode] = $field->getValue($this->serializeComputedFieldValues); } } - // Serialize initialized fields only if requested so. - $this->fields = $this->serializeFields ? $this->fields : []; + $this->fields = array(); $this->fieldDefinitions = NULL; $this->languages = NULL; $this->clearTranslationCache(); @@ -436,7 +442,7 @@ * {@inheritdoc} */ public function __wakeup() { - $this->serializeFields = FALSE; + $this->serializeComputedFieldValues = FALSE; parent::__wakeup(); } diff -u b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php --- b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php @@ -204,12 +204,12 @@ /** * {@inheritdoc} */ - public function getValue() { + public function getValue($include_computed = FALSE) { $values = parent::getValue(); // If there is an unsaved entity, return it as part of the field item values // to ensure idempotency of getValue() / setValue(). - if ($this->hasNewEntity()) { + if ($include_computed || $this->hasNewEntity()) { $values['entity'] = $this->entity; } return $values; @@ -666,14 +666,2 @@ - /** - * {@inheritdoc} - */ - public function __sleep() { - // If the parent entity is serializing the initialized fields so have to do - // the referenced entity as well. - if ($this->getEntity()->serializeFields && isset($this->entity)) { - $this->entity->serializeFields = TRUE; - } - return parent::__sleep(); - } - } diff -u b/core/tests/Drupal/KernelTests/Core/Entity/EntitySerializationTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntitySerializationTest.php --- b/core/tests/Drupal/KernelTests/Core/Entity/EntitySerializationTest.php +++ b/core/tests/Drupal/KernelTests/Core/Entity/EntitySerializationTest.php @@ -109,21 +109,21 @@ public function testEntitySerializationWithSerializingEntityReferences() { $entity = $this->createEntity(); - // Assert that using the "serializeFields" flag the serialization will - // serialize references. + // Assert that using the "serializeComputedFieldValues" flag the + // serialization will serialize references. $original_label = $entity->{$this->fieldName}->entity->label(); $new_label = 'test referenced entity changed'; $this->assertNotEquals($original_label, $new_label); $entity->{$this->fieldName}->entity->name = $new_label; - $entity->serializeFields = TRUE; + $entity->serializeComputedFieldValues = TRUE; $serialized_entity = serialize($entity); $entity = unserialize($serialized_entity); $this->assertEquals($new_label, $entity->{$this->fieldName}->entity->label()); - // Assert that after unserializing the entity the "serializeFields" flag is - // reset. - $this->assertTrue(empty($entity->serializeFields)); - $this->assertTrue(empty($entity->{$this->fieldName}->entity->serializeFields)); + // Assert that after unserializing the entity the + // "serializeComputedFieldValues" flag is reset. + $this->assertTrue(empty($entity->serializeComputedFieldValues)); + $this->assertTrue(empty($entity->{$this->fieldName}->entity->serializeComputedFieldValues)); } /** @@ -132,8 +132,8 @@ public function testEntitySerializationWithSerializingEntityReferencesDeeperStructure() { $entity = $this->createEntity(); - // Assert that using the "serializeFields" flag the serialization will - // serialize references on a deeper level as well. + // Assert that using the "serializeComputedFieldValues" flag the + // serialization will serialize references on a deeper level as well. $original_label_first_reference = $entity->{$this->fieldName}->entity->label(); $new_label_first_reference = 'test referenced entity changed'; $this->assertNotEquals($original_label_first_reference, $new_label_first_reference); @@ -143,16 +143,16 @@ $entity->{$this->fieldName}->entity->name = $new_label_first_reference; $entity->{$this->fieldName}->entity->{$this->fieldName}->entity->name = $new_label_second_reference; - $entity->serializeFields = TRUE; + $entity->serializeComputedFieldValues = TRUE; $serialized_entity = serialize($entity); $entity = unserialize($serialized_entity); $this->assertEquals($new_label_first_reference, $entity->{$this->fieldName}->entity->label()); $this->assertEquals($new_label_second_reference, $entity->{$this->fieldName}->entity->{$this->fieldName}->entity->label()); - // Assert that after unserializing the entity the "serializeFields" flag is - // reset. - $this->assertTrue(empty($entity->serializeFields)); - $this->assertTrue(empty($entity->{$this->fieldName}->entity->serializeFields)); - $this->assertTrue(empty($entity->{$this->fieldName}->entity->{$this->fieldName}->entity->serializeFields)); + // Assert that after unserializing the entity the + // "serializeComputedFieldValues" flag is reset. + $this->assertTrue(empty($entity->serializeComputedFieldValues)); + $this->assertTrue(empty($entity->{$this->fieldName}->entity->serializeComputedFieldValues)); + $this->assertTrue(empty($entity->{$this->fieldName}->entity->{$this->fieldName}->entity->serializeComputedFieldValues)); } /**