76 lines
2.6 KiB
C#
76 lines
2.6 KiB
C#
|
using ln.json;
|
|||
|
using ln.json.mapping;
|
|||
|
using ln.logging;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Reflection;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace ln.objects.serialization.json
|
|||
|
{
|
|||
|
public class JSONDeserializer : Deserializer
|
|||
|
{
|
|||
|
ObjectStore ObjectStore;
|
|||
|
public JSONMapper Mapper { get; }
|
|||
|
|
|||
|
public JSONDeserializer(ObjectStore objectStore)
|
|||
|
{
|
|||
|
ObjectStore = objectStore;
|
|||
|
Mapper = new JSONMapper() { DefaultBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, DefaultMappingFlags = JSONObjectMappingFlags.FIELDS };
|
|||
|
Mapper.OnRequestCustomUnserialization += Mapper_OnRequestCustomUnserialization;
|
|||
|
|
|||
|
Mapper.AddMappingFactory(
|
|||
|
typeof(IList<>),
|
|||
|
(Type targetType, out JSONMapping mapping) =>
|
|||
|
{
|
|||
|
mapping = (JSONMapping)Activator.CreateInstance(typeof(LazyListMapping<>).MakeGenericType(targetType.GetGenericArguments()),objectStore);
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private bool Mapper_OnRequestCustomUnserialization(JSONValue json, Type targetType, out object o)
|
|||
|
{
|
|||
|
if (!(json is JSONNull) && !targetType.IsValueType && !targetType.IsInterface && Mapper.GetOrBuildMapping(targetType, out JSONMapping mapping) && mapping is JSONObjectMapping)
|
|||
|
{
|
|||
|
Guid uid = new Guid(Convert.FromBase64String((json as JSONString).Value));
|
|||
|
return TryLookupObject(uid, targetType, out o);
|
|||
|
}
|
|||
|
o = null;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
public override bool DeserializeObject(byte[] serializedBytes, ref object o)
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
/*
|
|||
|
if (ObjectStore.DEBUG)
|
|||
|
Logging.Log(LogLevel.DEBUG, "Deserializing: {0}", Encoding.UTF8.GetString(serializedBytes));
|
|||
|
|
|||
|
if (serializedBytes.Length == 0)
|
|||
|
{
|
|||
|
o = null;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
if (Mapper.GetOrBuildMapping(targetType, out JSONMapping mapping))
|
|||
|
{
|
|||
|
JSONValue json = JSONParser.Parse(Encoding.UTF8.GetString(serializedBytes));
|
|||
|
if (mapping is JSONObjectMapping objectMapping)
|
|||
|
{
|
|||
|
objectMapping.Apply(Mapper, json as JSONObject, o);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
o = mapping.FromJson(Mapper, json);
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
throw new NotSupportedException();
|
|||
|
*/
|
|||
|
}
|
|||
|
}
|
|||
|
}
|