Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 51 additions & 17 deletions Shared/MessagePack/ConverterContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,17 @@ internal static Hashtable GetMappingsValues(Type targetType, object value)

foreach (var memberMapping in memberMappings)
{
#if NANOFRAMEWORK_1_0
if(!memberMapping.OriginalName!.StartsWith(MemberMapping.SET_))
{
#endif
if (memberMapping.TryGetValue(value, out var memberValue) && memberValue != null)
{
result.Add(memberMapping.Name!, memberValue);
}
#if NANOFRAMEWORK_1_0
}
#endif
}
return result;
}
Expand All @@ -156,27 +163,38 @@ internal static void SetMappingsValues(Type targetType, object targetObject, Has

foreach (var memberMapping in memberMappings)
{
#if NANOFRAMEWORK_1_0
if(!memberMapping.OriginalName!.StartsWith(MemberMapping.GET_))
{
#endif
if (objectValuesMap.Contains(memberMapping.Name!))
{
var memberMpToken = (ArraySegment)objectValuesMap[memberMapping.Name!]!;
var memberValueMapType = memberMapping.GetMemberType();
var converter = GetConverter(memberValueMapType!);
if (converter != null)
{
memberMapping.SetValue(targetObject, converter.Read(new ByteArrayReader((byte[])memberMpToken))!);
}
else
if (memberMpToken != null)
{
if (memberValueMapType!.IsArray)
var memberValueMapType = memberMapping.GetMemberType();
var converter = GetConverter(memberValueMapType!);
if (converter != null)
{
memberMapping.SetValue(targetObject, ArrayConverter.Read(new ByteArrayReader((byte[])memberMpToken), memberValueMapType)!);
memberMapping.SetValue(targetObject, converter.Read(memberMpToken)!);
}
else
{
memberMapping.SetValue(targetObject, DeserializeObject(memberValueMapType!, new ByteArrayReader((byte[])memberMpToken))!);
if (memberValueMapType!.IsArray)
{
memberMapping.SetValue(targetObject, ArrayConverter.Read(memberMpToken, memberValueMapType)!);
}
else
{

memberMapping.SetValue(targetObject, DeserializeObject(memberValueMapType!, memberMpToken)!);
}
}
}
}
#if NANOFRAMEWORK_1_0
}
#endif
}
}

Expand Down Expand Up @@ -234,6 +252,16 @@ internal static void SerializeObject(Type type, object value, IMessagePackWriter
#nullable enable
internal static object? DeserializeObject(Type type, IMessagePackReader reader)
{
if (type.Name == typeof(IDictionary).Name || type.Name == typeof(Hashtable).Name)
{
return MapConverter.Read(reader);
}

if (type.IsArray)
{
return ArrayConverter.Read(reader, type);
}

var objectMap = reader.GetMassagePackObjectTokens();
if (objectMap != null && objectMap is Hashtable targetObjectMap)
{
Expand Down Expand Up @@ -284,18 +312,23 @@ internal static void SerializeObject(Type type, object value, IMessagePackWriter
}

#if NANOFRAMEWORK_1_0
[MethodImpl(MethodImplOptions.Synchronized)]
private static void ThreadSafeAddItemCache(Hashtable hashtable, object key, object value)
{
if (!hashtable.Contains(key))
{
try
lock(_mappingDictionary)
{
hashtable.Add(key, value);
}
catch (Exception ex)
{
Debug.WriteLine($"Error added key: '{key}', value: '{value}'\r\n{ex}");
try
{
if (!hashtable.Contains(key))
{
hashtable.Add(key, value);
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error added key: '{key}', value: '{value}'\r\n{ex}");
}
}
}
}
Expand Down Expand Up @@ -369,3 +402,4 @@ private static DateTime ReadDateTimeExt(DataTypes type, IMessagePackReader reade
}
}
}

2 changes: 1 addition & 1 deletion Shared/MessagePack/Converters/IConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace nanoFramework.MessagePack.Converters
{
/// <summary>
/// <see cref="Converter"/> interface.
/// <see cref="IConverter"/> interface.
/// </summary>
public interface IConverter
{
Expand Down
2 changes: 1 addition & 1 deletion Shared/MessagePack/Converters/MapConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ private static void Write(IDictionary value, IMessagePackWriter writer)
}

#nullable enable
private static Hashtable? Read(IMessagePackReader reader)
internal static Hashtable? Read(IMessagePackReader reader)
{
var length = reader.ReadMapLength();
return ((long)length) > -1 ? ReadMap(reader, length) : null;
Expand Down
6 changes: 4 additions & 2 deletions Shared/MessagePack/Converters/StringConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System.Diagnostics.CodeAnalysis;
using System.Text;
using nanoFramework.MessagePack.Dto;
using nanoFramework.MessagePack.Extensions;
using nanoFramework.MessagePack.Stream;
using nanoFramework.MessagePack.Utility;
Expand Down Expand Up @@ -58,9 +59,10 @@ private static string Read(IMessagePackReader reader)

internal static string ReadString(IMessagePackReader reader, uint length)
{
var buffer = (byte[])reader.ReadBytes(length);
ArraySegment arraySegment = reader.ReadBytes(length);

return Utf8.GetString(arraySegment.SourceBuffer, (int)arraySegment.SourceOffset + arraySegment.Position, (int)arraySegment.Length);

return Utf8.GetString(buffer, 0, buffer.Length);
}

private static bool TryGetFixStrLength(DataTypes type, out uint length)
Expand Down
Loading