// region Serializing references - specific functionality
  private XNode serializeReferenceValue(
      PrismReferenceValue value, PrismReferenceDefinition definition, SerializationContext ctx)
      throws SchemaException {
    MapXNode xmap = new MapXNode();
    boolean containsOid = false;
    String namespace =
        definition != null
            ? definition.getNamespace()
            : null; // namespace for filter and description
    if (StringUtils.isNotBlank(value.getOid())) {
      containsOid = true;
      xmap.put(XNode.KEY_REFERENCE_OID, createPrimitiveXNodeStringAttr(value.getOid()));
    }
    QName relation = value.getRelation();
    if (relation != null) {
      xmap.put(XNode.KEY_REFERENCE_RELATION, createPrimitiveXNodeAttr(relation, DOMUtil.XSD_QNAME));
    }
    QName targetType = value.getTargetType();
    if (targetType != null) {
      xmap.put(XNode.KEY_REFERENCE_TYPE, createPrimitiveXNodeAttr(targetType, DOMUtil.XSD_QNAME));
    }
    String description = value.getDescription();
    if (description != null) {
      xmap.put(
          createReferenceQName(XNode.KEY_REFERENCE_DESCRIPTION, namespace),
          createPrimitiveXNode(description, DOMUtil.XSD_STRING));
    }
    SearchFilterType filter = value.getFilter();
    if (filter != null) {
      XNode xsubnode = filter.serializeToXNode();
      xmap.put(createReferenceQName(XNode.KEY_REFERENCE_FILTER, namespace), xsubnode);
    }
    if (value.getTargetName() != null) {
      if (SerializationContext.isSerializeReferenceNames(ctx)) {
        XNode xsubnode = createPrimitiveXNode(value.getTargetName(), PolyStringType.COMPLEX_TYPE);
        xmap.put(createReferenceQName(XNode.KEY_REFERENCE_TARGET_NAME, namespace), xsubnode);
      } else {
        String commentValue = " " + value.getTargetName().getOrig() + " ";
        xmap.setComment(commentValue);
      }
    }

    boolean isComposite = false;
    if (definition != null) {
      isComposite = definition.isComposite();
    }
    if ((serializeCompositeObjects || isComposite || !containsOid) && value.getObject() != null) {
      XNode xobjnode = serializeObjectContent(value.getObject(), ctx);
      xmap.put(createReferenceQName(XNode.KEY_REFERENCE_OBJECT, namespace), xobjnode);
    }

    return xmap;
  }