/// <inheritdoc /> public dynamic Objectify( JToken graphsonObject, Type type, IGraphTypeSerializer serializer, IGenericSerializer genericSerializer) { var keyspace = serializer.FromDb <string>(graphsonObject["keyspace"]); var name = serializer.FromDb <string>(graphsonObject["name"]); var values = (JArray)graphsonObject["value"]; var targetTypeIsDictionary = false; Type elementType = null; if (type.GetTypeInfo().IsGenericType && (type.GetGenericTypeDefinition() == typeof(IReadOnlyDictionary <,>) || type.GetGenericTypeDefinition() == typeof(Dictionary <,>) || type.GetGenericTypeDefinition() == typeof(IDictionary <,>))) { targetTypeIsDictionary = true; var genericArgs = type.GetTypeInfo().GetGenericArguments(); if (genericArgs[0] != typeof(string)) { throw new InvalidOperationException( "Deserializing UDT to Dictionary is only supported when the dictionary key is of type \"string\"."); } elementType = genericArgs[1]; } UdtMap udtMap = null; bool readToDictionary; if (targetTypeIsDictionary) { readToDictionary = true; } else { udtMap = genericSerializer.GetUdtMapByName($"{keyspace}.{name}"); if (udtMap != null) { readToDictionary = false; } else { readToDictionary = true; elementType = typeof(object); } } var obj = readToDictionary ? ToDictionary(serializer, elementType, (JArray)graphsonObject["definition"], values) : ToObject(serializer, udtMap, values); if (!serializer.ConvertFromDb(obj, type, out var result)) { throw new InvalidOperationException($"Could not convert UDT from type {obj.GetType().FullName} to {type.FullName}"); } return(result); }
internal object ToObject(IGraphTypeSerializer serializer, UdtMap map, IEnumerable <JToken> valuesArr) { var obj = Activator.CreateInstance(map.NetType); var i = 0; foreach (var value in valuesArr) { if (i >= map.Definition.Fields.Count) { break; } var field = map.Definition.Fields[i]; i++; var prop = map.GetPropertyForUdtField(field.Name); if (prop == null) { continue; } var convertedValue = serializer.FromDb(value, prop.PropertyType, false); prop.SetValue(obj, convertedValue, null); } return(obj); }
/// <inheritdoc /> public dynamic Objectify( JToken graphsonObject, Type type, IGraphTypeSerializer serializer, IGenericSerializer genericSerializer) { if (!Utils.IsTuple(type)) { throw new InvalidOperationException($"Can not deserialize a tuple to {type.FullName}."); } var values = (JArray)graphsonObject["value"]; var genericArguments = type.GetGenericArguments(); if (genericArguments.Length != values.Count) { throw new InvalidOperationException( "Could not deserialize tuple, number of elements don't match " + $"(expected {genericArguments.Length} but the server returned {values.Count})."); } var tupleValues = new object[values.Count]; for (var i = 0; i < tupleValues.Length; i++) { tupleValues[i] = serializer.FromDb(values[i], genericArguments[i], false); } return(Activator.CreateInstance(type, tupleValues)); }
internal object ToDictionary( IGraphTypeSerializer serializer, Type elementType, IEnumerable <JToken> definitions, IEnumerable <JToken> valuesArr) { var fieldNames = definitions.Select(def => (string)def["fieldName"]).ToArray(); var newDictionary = (IDictionary)Activator.CreateInstance(typeof(Dictionary <,>).MakeGenericType(typeof(string), elementType)); var elementIsGraphNode = elementType == typeof(GraphNode) || elementType == typeof(IGraphNode); var i = 0; foreach (var value in valuesArr) { var newValue = elementIsGraphNode ? new GraphNode(new GraphSONNode(serializer, value)) : serializer.FromDb(value, elementType, false); var key = fieldNames[i]; i++; newDictionary.Add(key, newValue); } return(newDictionary); }