Files
2026-03-04 10:03:45 +08:00

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();
}
}
}