diff --git a/Source/Engine/Serialization/JsonWriter.cpp b/Source/Engine/Serialization/JsonWriter.cpp index 2cbf423fd..223baf77e 100644 --- a/Source/Engine/Serialization/JsonWriter.cpp +++ b/Source/Engine/Serialization/JsonWriter.cpp @@ -306,13 +306,8 @@ void JsonWriter::CommonValue(const ::CommonValue& value) Matrix(value.AsMatrix); break; case CommonType::Blob: - { - ::Array base64; - base64.Resize(Encryption::Base64EncodeLength(value.AsBlob.Length)); - Encryption::Base64Encode(value.AsBlob.Data, value.AsBlob.Length, base64.Get()); - String(base64.Get(), base64.Count()); + Blob(value.AsBlob.Data, value.AsBlob.Length); break; - } case CommonType::Object: Guid(value.GetObjectId()); break; diff --git a/Source/Engine/Serialization/Serialization.h b/Source/Engine/Serialization/Serialization.h index 182ac71cf..94acd1d79 100644 --- a/Source/Engine/Serialization/Serialization.h +++ b/Source/Engine/Serialization/Serialization.h @@ -588,16 +588,6 @@ namespace Serialization } template inline void Deserialize(ISerializable::DeserializeStream& stream, Array& v, ISerializeModifier* modifier) - { - if (!stream.IsArray()) - return; - const auto& streamArray = stream.GetArray(); - v.Resize(streamArray.Size()); - for (int32 i = 0; i < v.Count(); i++) - Deserialize(streamArray[i], (T&)v[i], modifier); - } - template - inline void Deserialize(ISerializable::DeserializeStream& stream, Array& v, ISerializeModifier* modifier) { if (stream.IsArray()) { @@ -606,12 +596,12 @@ namespace Serialization for (int32 i = 0; i < v.Count(); i++) Deserialize(streamArray[i], v[i], modifier); } - else if (stream.IsString()) + else if (TIsPODType::Value && stream.IsString()) { - // byte[] encoded as Base64 + // T[] encoded as Base64 const StringAnsiView streamView(stream.GetStringAnsiView()); - v.Resize(Encryption::Base64DecodeLength(*streamView, streamView.Length())); - Encryption::Base64Decode(*streamView, streamView.Length(), v.Get()); + v.Resize(Encryption::Base64DecodeLength(*streamView, streamView.Length()) / sizeof(T)); + Encryption::Base64Decode(*streamView, streamView.Length(), (byte*)v.Get()); } } diff --git a/Source/Engine/Utilities/Encryption.cpp b/Source/Engine/Utilities/Encryption.cpp index 60b6e18f4..0693c99b0 100644 --- a/Source/Engine/Utilities/Encryption.cpp +++ b/Source/Engine/Utilities/Encryption.cpp @@ -5,16 +5,11 @@ namespace { - const char* base64_chars = + const char* Base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; - bool is_base64(byte c) - { - return StringUtils::IsAlnum((char)c) || c == '+' || c == '/'; - } - // @formatter:off const int32 B64index[256] = { @@ -76,23 +71,23 @@ void Encryption::Base64Encode(const byte* bytes, int32 size, char* encoded) int32 i; for (i = 0; i < size - 2; i += 3) { - *encoded++ = base64_chars[bytes[i] >> 2 & 0x3F]; - *encoded++ = base64_chars[(bytes[i] & 0x3) << 4 | (int32)(bytes[i + 1] & 0xF0) >> 4]; - *encoded++ = base64_chars[(bytes[i + 1] & 0xF) << 2 | (int32)(bytes[i + 2] & 0xC0) >> 6]; - *encoded++ = base64_chars[bytes[i + 2] & 0x3F]; + *encoded++ = Base64Chars[bytes[i] >> 2 & 0x3F]; + *encoded++ = Base64Chars[(bytes[i] & 0x3) << 4 | (int32)(bytes[i + 1] & 0xF0) >> 4]; + *encoded++ = Base64Chars[(bytes[i + 1] & 0xF) << 2 | (int32)(bytes[i + 2] & 0xC0) >> 6]; + *encoded++ = Base64Chars[bytes[i + 2] & 0x3F]; } if (i < size) { - *encoded++ = base64_chars[bytes[i] >> 2 & 0x3F]; + *encoded++ = Base64Chars[bytes[i] >> 2 & 0x3F]; if (i == size - 1) { - *encoded++ = base64_chars[((bytes[i] & 0x3) << 4)]; + *encoded++ = Base64Chars[((bytes[i] & 0x3) << 4)]; *encoded++ = '='; } else { - *encoded++ = base64_chars[(bytes[i] & 0x3) << 4 | (int32)(bytes[i + 1] & 0xF0) >> 4]; - *encoded++ = base64_chars[((bytes[i + 1] & 0xF) << 2)]; + *encoded++ = Base64Chars[(bytes[i] & 0x3) << 4 | (int32)(bytes[i + 1] & 0xF0) >> 4]; + *encoded++ = Base64Chars[((bytes[i + 1] & 0xF) << 2)]; } *encoded = '='; }