// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Serialization/JsonFwd.h"
#include "Engine/Core/Compiler.h"
#include "Engine/Core/Config.h"
class JsonWriter;
class ISerializeModifier;
///
/// Interface for objects that can be serialized/deserialized to/from JSON format.
///
API_INTERFACE() class FLAXENGINE_API ISerializable
{
DECLARE_SCRIPTING_TYPE_MINIMAL(ISerializable);
public:
typedef rapidjson_flax::Document SerializeDocument;
///
/// Serialization output stream
///
typedef rapidjson_flax::Value DeserializeStream;
///
/// Serialization input stream
///
typedef JsonWriter SerializeStream;
public:
///
/// Finalizes an instance of the class.
///
virtual ~ISerializable() = default;
///
/// Serializes object to the output stream compared to the values of the other object instance (eg. default class object). If other object is null then serialize all properties.
///
/// The output stream.
/// The instance of the object to compare with and serialize only the modified properties. If null, then serialize all properties.
virtual void Serialize(SerializeStream& stream, const void* otherObj) = 0;
///
/// Deserializes object from the input stream.
///
/// The input stream.
/// The deserialization modifier object. Always valid.
virtual void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) = 0;
///
/// Deserializes object from the input stream child member. Won't deserialize it if member is missing.
///
/// The input stream.
/// The input stream member to lookup.
/// The deserialization modifier object. Always valid.
void DeserializeIfExists(DeserializeStream& stream, const char* memberName, ISerializeModifier* modifier);
};