text: // Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
  
  #pragma once
  
  #include "CoreMinimal.h"
  
  /**
   * Structure for the write state stack.
   */
  struct FStructSerializerState
  {
  	/** Holds a flag indicating whether the property has been processed. */
  	bool HasBeenProcessed;
  
  	/** Holds a pointer to the key property's data. */
  	const void* KeyData;
  
  	/** Holds the key property's meta data (only used for TMap). */
  	UProperty* KeyProperty;
  
  	/** Holds a pointer to the property value's data. */
  	const void* ValueData;
  
  	/** Holds the property value's meta data. */
  	UProperty* ValueProperty;
  
  	/** Holds a pointer to the UStruct describing the data. */
  	UStruct* ValueType;
  };
  
  
  /**
   * Interface for UStruct serializer backends.
   */
  class IStructSerializerBackend
  {
  public:
  
  	/**
  	 * Signals the beginning of an array.
  	 *
  	 * State.ValueProperty points to the property that holds the array.
  	 *
  	 * @param State The serializer's current state.
  	 * @see BeginStructure, EndArray
  	 */
  	virtual void BeginArray(const FStructSerializerState& State) = 0;
  
  	/**
  	 * Signals the beginning of a child structure.
  	 *
  	 * State.ValueProperty points to the property that holds the struct.
  	 *
  	 * @param State The serializer's current state.
  	 * @see BeginArray, EndStructure
  	 */
  	virtual void BeginStructure(const FStructSerializerState& State) = 0;
  
  	/**
  	 * Signals the end of an array.
  	 *
  	 * State.ValueProperty points to the property that holds the array.
  	 *
  	 * @param State The serializer's current state.
  	 * @see BeginArray, EndStructure
  	 */
  	virtual void EndArray(const FStructSerializerState& State) = 0;
  
  	/**
  	 * Signals the end of an object.
  	 *
  	 * State.ValueProperty points to the property that holds the struct.
  	 *
  	 * @param State The serializer's current state.
  	 * @see BeginStructure, EndArray
  	 */
  	virtual void EndStructure(const FStructSerializerState& State) = 0;
  
  	/**
  	 * Writes a comment to the output stream.
  	 *
  	 * @param Comment The comment text.
  	 * @see BeginArray, BeginStructure, EndArray, EndStructure, WriteProperty
  	 */
  	virtual void WriteComment(const FString& Comment) = 0;
  
  	/**
  	 * Writes a property to the output stream.
  	 *
  	 * Depending on the context, properties to be written can be either object properties or array elements.
  	 *
  	 * State.KeyProperty points to the key property that holds the data to write.
  	 * State.KeyData points to the key property's data.
  	 * State.ValueProperty points to the property that holds the value to write.
  	 * State.ValueData points to the actual data to write.
  	 * State.TypeInfo contains the data's type information
  	 * State.ArrayIndex is the optional index if the data is a value in an array.
  	 *
  	 * @param State The serializer's current state.
  	 * @see BeginArray, BeginStructure, EndArray, EndStructure, WriteComment
  	 */
  	virtual void WriteProperty(const FStructSerializerState& State, int32 ArrayIndex = 0) = 0;
  
  public:
  
  	/** Virtual destructor. */
  	virtual ~IStructSerializerBackend() { }
  };
  