diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/ByteStreamSerializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/ByteStreamSerializer.cpp index 6077a66682..f15178dd00 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/ByteStreamSerializer.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/ByteStreamSerializer.cpp @@ -10,91 +10,75 @@ * */ -#include "ByteStreamSerializer.h" - #include #include +#include #include #include namespace AZ { - namespace ByteSerializerInternal - { - static JsonSerializationResult::Result Load(void* outputValue, const rapidjson::Value& inputValue, JsonDeserializerContext& context) - { - using JsonSerializationResult::Outcomes; - using JsonSerializationResult::Tasks; - - AZ_Assert(outputValue, "Expected a valid pointer to load from json value."); - - switch (inputValue.GetType()) - { - case rapidjson::kStringType: { - JsonByteStream buffer; - if (AZ::StringFunc::Base64::Decode(buffer, inputValue.GetString(), inputValue.GetStringLength())) - { - JsonByteStream* valAsByteStream = static_cast(outputValue); - *valAsByteStream = AZStd::move(buffer); - return context.Report(Tasks::ReadField, Outcomes::Success, "Successfully read ByteStream."); - } - return context.Report(Tasks::ReadField, Outcomes::Invalid, "Decode of Base64 encoded ByteStream failed."); - } - case rapidjson::kArrayType: - case rapidjson::kObjectType: - case rapidjson::kNullType: - case rapidjson::kFalseType: - case rapidjson::kTrueType: - case rapidjson::kNumberType: - return context.Report( - Tasks::ReadField, Outcomes::Unsupported, - "Unsupported type. ByteStream values cannot be read from arrays, objects, nulls, booleans or numbers."); - default: - return context.Report(Tasks::ReadField, Outcomes::Unknown, "Unknown json type encountered for ByteStream value."); - } - } - - static JsonSerializationResult::Result StoreWithDefault( - rapidjson::Value& outputValue, const void* inputValue, const void* defaultValue, JsonSerializerContext& context) - { - using JsonSerializationResult::Outcomes; - using JsonSerializationResult::Tasks; - - const JsonByteStream& valAsByteStream = *static_cast(inputValue); - if (context.ShouldKeepDefaults() || !defaultValue || (valAsByteStream != *static_cast(defaultValue))) - { - const auto base64ByteStream = AZ::StringFunc::Base64::Encode(valAsByteStream.data(), valAsByteStream.size()); - outputValue.SetString(base64ByteStream.c_str(), base64ByteStream.size(), context.GetJsonAllocator()); - return context.Report(Tasks::WriteValue, Outcomes::Success, "ByteStream successfully stored."); - } - - return context.Report(Tasks::WriteValue, Outcomes::DefaultsUsed, "Default ByteStream used."); - } - } // namespace ByteSerializerInternal - AZ_CLASS_ALLOCATOR_IMPL(JsonByteStreamSerializer, SystemAllocator, 0); JsonSerializationResult::Result JsonByteStreamSerializer::Load( void* outputValue, [[maybe_unused]] const Uuid& outputValueTypeId, const rapidjson::Value& inputValue, JsonDeserializerContext& context) { + using JsonSerializationResult::Outcomes; + using JsonSerializationResult::Tasks; + AZ_Assert( azrtti_typeid() == outputValueTypeId, "Unable to deserialize AZStd::vector> to json because the provided type is %s", outputValueTypeId.ToString().c_str()); + AZ_Assert(outputValue, "Expected a valid pointer to load from json value."); - return ByteSerializerInternal::Load(outputValue, inputValue, context); + switch (inputValue.GetType()) + { + case rapidjson::kStringType: { + JsonByteStream buffer; + if (AZ::StringFunc::Base64::Decode(buffer, inputValue.GetString(), inputValue.GetStringLength())) + { + JsonByteStream* valAsByteStream = static_cast(outputValue); + *valAsByteStream = AZStd::move(buffer); + return context.Report(Tasks::ReadField, Outcomes::Success, "Successfully read ByteStream."); + } + return context.Report(Tasks::ReadField, Outcomes::Invalid, "Decode of Base64 encoded ByteStream failed."); + } + case rapidjson::kArrayType: + case rapidjson::kObjectType: + case rapidjson::kNullType: + case rapidjson::kFalseType: + case rapidjson::kTrueType: + case rapidjson::kNumberType: + return context.Report( + Tasks::ReadField, Outcomes::Unsupported, + "Unsupported type. ByteStream values cannot be read from arrays, objects, nulls, booleans or numbers."); + default: + return context.Report(Tasks::ReadField, Outcomes::Unknown, "Unknown json type encountered for ByteStream value."); + } } JsonSerializationResult::Result JsonByteStreamSerializer::Store( rapidjson::Value& outputValue, const void* inputValue, const void* defaultValue, [[maybe_unused]] const Uuid& valueTypeId, JsonSerializerContext& context) { + using JsonSerializationResult::Outcomes; + using JsonSerializationResult::Tasks; + AZ_Assert( azrtti_typeid() == valueTypeId, "Unable to serialize AZStd::vector to json because the provided type is %s", valueTypeId.ToString().c_str()); - return ByteSerializerInternal::StoreWithDefault(outputValue, inputValue, defaultValue, context); + const JsonByteStream& valAsByteStream = *static_cast(inputValue); + if (context.ShouldKeepDefaults() || !defaultValue || (valAsByteStream != *static_cast(defaultValue))) + { + const auto base64ByteStream = AZ::StringFunc::Base64::Encode(valAsByteStream.data(), valAsByteStream.size()); + outputValue.SetString(base64ByteStream.c_str(), base64ByteStream.size(), context.GetJsonAllocator()); + return context.Report(Tasks::WriteValue, Outcomes::Success, "ByteStream successfully stored."); + } + + return context.Report(Tasks::WriteValue, Outcomes::DefaultsUsed, "Default ByteStream used."); } } // namespace AZ