@Override
  public void setValue(T value) {
    this.actualValue = value;

    checkPrismContext();
    if (value != null && prismContext.canSerialize(value)) {
      try {
        this.valueForStorageWhenEncoded =
            prismContext.xmlSerializer().serializeAnyData(value, new QName("value"));
      } catch (SchemaException e) {
        throw new SystemException(
            "Couldn't serialize value of type " + value.getClass() + ": " + e.getMessage(), e);
      }
      this.valueForStorageWhenNotEncoded = null;
      encodingScheme = EncodingScheme.PRISM;
    } else if (value == null || value instanceof Serializable) {
      this.valueForStorageWhenNotEncoded = value;
      this.valueForStorageWhenEncoded = null;
      encodingScheme = EncodingScheme.NONE;
      if (value instanceof Itemable) {
        throw new IllegalStateException(
            "Itemable value is used as not-encoded serializable item; value = " + value);
      }
    } else {
      throw new IllegalStateException(
          "Attempt to put non-serializable item "
              + value.getClass()
              + " into "
              + this.getClass().getSimpleName());
    }
  }