77 lines
2.1 KiB
C#
77 lines
2.1 KiB
C#
using System;
|
|
using System.Collections;
|
|
|
|
namespace Gaia.FullSerializer.Internal
|
|
{
|
|
public class fsReflectedConverter : fsConverter
|
|
{
|
|
public override bool CanProcess(Type type)
|
|
{
|
|
if (type.Resolve().IsArray || typeof(ICollection).IsAssignableFrom(type))
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType)
|
|
{
|
|
serialized = fsData.CreateDictionary();
|
|
fsResult success = fsResult.Success;
|
|
fsMetaType fsMetaType2 = fsMetaType.Get(instance.GetType());
|
|
fsMetaType2.EmitAotData();
|
|
for (int i = 0; i < fsMetaType2.Properties.Length; i++)
|
|
{
|
|
fsMetaProperty fsMetaProperty2 = fsMetaType2.Properties[i];
|
|
if (fsMetaProperty2.CanRead)
|
|
{
|
|
fsData data;
|
|
fsResult result = Serializer.TrySerialize(fsMetaProperty2.StorageType, fsMetaProperty2.Read(instance), out data);
|
|
success.AddMessages(result);
|
|
if (!result.Failed)
|
|
{
|
|
serialized.AsDictionary[fsMetaProperty2.JsonName] = data;
|
|
}
|
|
}
|
|
}
|
|
return success;
|
|
}
|
|
|
|
public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType)
|
|
{
|
|
fsResult success = fsResult.Success;
|
|
fsResult fsResult2 = (success += CheckType(data, fsDataType.Object));
|
|
if (fsResult2.Failed)
|
|
{
|
|
return success;
|
|
}
|
|
fsMetaType fsMetaType2 = fsMetaType.Get(storageType);
|
|
fsMetaType2.EmitAotData();
|
|
for (int i = 0; i < fsMetaType2.Properties.Length; i++)
|
|
{
|
|
fsMetaProperty fsMetaProperty2 = fsMetaType2.Properties[i];
|
|
if (fsMetaProperty2.CanWrite && data.AsDictionary.TryGetValue(fsMetaProperty2.JsonName, out var value))
|
|
{
|
|
object result = null;
|
|
if (fsMetaProperty2.CanRead)
|
|
{
|
|
result = fsMetaProperty2.Read(instance);
|
|
}
|
|
fsResult result2 = Serializer.TryDeserialize(value, fsMetaProperty2.StorageType, ref result);
|
|
success.AddMessages(result2);
|
|
if (!result2.Failed)
|
|
{
|
|
fsMetaProperty2.Write(instance, result);
|
|
}
|
|
}
|
|
}
|
|
return success;
|
|
}
|
|
|
|
public override object CreateInstance(fsData data, Type storageType)
|
|
{
|
|
return fsMetaType.Get(storageType).CreateInstance();
|
|
}
|
|
}
|
|
}
|