Various improvements to serialization of data encoded via Base64 to Json
This commit is contained in:
@@ -306,13 +306,8 @@ void JsonWriter::CommonValue(const ::CommonValue& value)
|
||||
Matrix(value.AsMatrix);
|
||||
break;
|
||||
case CommonType::Blob:
|
||||
{
|
||||
::Array<char> 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;
|
||||
|
||||
@@ -588,16 +588,6 @@ namespace Serialization
|
||||
}
|
||||
template<typename T, typename AllocationType = HeapAllocation>
|
||||
inline void Deserialize(ISerializable::DeserializeStream& stream, Array<T, AllocationType>& 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<typename AllocationType = HeapAllocation>
|
||||
inline void Deserialize(ISerializable::DeserializeStream& stream, Array<byte, AllocationType>& 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<T>::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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 = '=';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user