ln.json/reflection/ObjectPoolContainerSerializ...

110 lines
4.0 KiB
C#
Raw Permalink Normal View History

2020-02-24 17:41:17 +01:00
using System;
using ln.types.reflection;
using ln.json.mapping;
2020-03-03 17:05:31 +01:00
using ln.types;
2020-02-24 17:41:17 +01:00
namespace ln.json.reflection
{
public class ObjectPoolContainerSerializer
{
public ObjectPoolContainer ObjectPoolContainer { get; }
public ObjectPoolContainerSerializer(ObjectPoolContainer objectPoolContainer)
{
ObjectPoolContainer = objectPoolContainer;
}
public JSONObject Serialize()
{
JSONObject serializedPoolContainer = new JSONObject();
foreach (ObjectPool objectPool in ObjectPoolContainer.Pools)
{
JSONArray objectList = new JSONArray();
2020-03-03 17:05:31 +01:00
foreach (object o in objectPool.OwnInstances)
2020-02-24 17:41:17 +01:00
{
2020-03-03 17:05:31 +01:00
objectList.Add(SerializeObject(objectPool, o));
2020-02-24 17:41:17 +01:00
}
serializedPoolContainer.Add(objectPool.ObjectType.Name, objectList);
}
return serializedPoolContainer;
}
2020-03-03 17:05:31 +01:00
public JSONObject SerializeObject(ObjectPool objectPool, object o)
{
TypeDescriptor typeDescriptor = objectPool.TypeDescriptor;
JSONObject jObject = new JSONObject();
jObject["__origin__"] = o.GetType().Name;
foreach (AttributeDescriptor attributeDescriptor in typeDescriptor.AttributeDescriptors)
{
object attributeValue = attributeDescriptor.GetValue(o);
if (ObjectPoolContainer.KnowsType(attributeDescriptor.AttributeType))
{
attributeValue = ObjectPoolContainer[attributeDescriptor.AttributeType].GetIdentity(attributeValue);
}
jObject.Add(attributeDescriptor.AttributeName, JSONMapper.DefaultMapper.ToJson(attributeValue));
}
return jObject;
}
2020-02-24 17:41:17 +01:00
public void Unserialize(JSONObject serializedPoolContainer)
{
foreach (ObjectPool objectPool in ObjectPoolContainer.Pools)
{
if (serializedPoolContainer.ContainsKey(objectPool.ObjectType.Name))
{
JSONArray serializedObjects = serializedPoolContainer[objectPool.ObjectType.Name] as JSONArray;
foreach (JSONObject serializedObject in serializedObjects.Children)
{
2020-03-03 17:05:31 +01:00
objectPool.Add(UnserializeObject(objectPool, serializedObject));
2020-02-24 17:41:17 +01:00
}
}
}
}
2020-03-03 17:05:31 +01:00
public object UnserializeObject(ObjectPool objectPool, JSONObject jObject)
{
object o = Activator.CreateInstance(objectPool.ObjectType);
UpdateObject(objectPool, o, jObject);
return o;
}
public void UpdateObject(ObjectPool objectPool, object o, JSONObject jObject)
{
TypeDescriptor typeDescriptor = objectPool.TypeDescriptor;
foreach (AttributeDescriptor attributeDescriptor in typeDescriptor.AttributeDescriptors)
{
if (jObject.ContainsKey(attributeDescriptor.AttributeName))
ApplyValue(objectPool, attributeDescriptor, o, jObject[attributeDescriptor.AttributeName]);
}
}
public void ApplyValue(ObjectPool objectPool, AttributeDescriptor attributeDescriptor, object o, JSONValue jValue)
{
object attributeValue;
if (ObjectPoolContainer.KnowsType(attributeDescriptor.AttributeType))
{
attributeValue = ObjectPoolContainer[attributeDescriptor.AttributeType][jValue.ToNative()];
}
else
{
attributeValue = JSONMapper.DefaultMapper.FromJson(jValue, attributeDescriptor.AttributeType);
}
if (!object.ReferenceEquals(null,attributeValue) && !object.Equals(attributeValue.GetType(), attributeDescriptor.AttributeType))
attributeValue = Cast.To(attributeValue, attributeDescriptor.AttributeType);
attributeDescriptor.SetValue(o, attributeValue);
}
2020-02-24 17:41:17 +01:00
}
}