72 lines
1.9 KiB
C#
72 lines
1.9 KiB
C#
using System;
|
|
|
|
namespace Gaia.FullSerializer.Internal
|
|
{
|
|
public class fsForwardConverter : fsConverter
|
|
{
|
|
private string _memberName;
|
|
|
|
public fsForwardConverter(fsForwardAttribute attribute)
|
|
{
|
|
_memberName = attribute.MemberName;
|
|
}
|
|
|
|
public override bool CanProcess(Type type)
|
|
{
|
|
throw new NotSupportedException("Please use the [fsForward(...)] attribute.");
|
|
}
|
|
|
|
private fsResult GetProperty(object instance, out fsMetaProperty property)
|
|
{
|
|
fsMetaProperty[] properties = fsMetaType.Get(instance.GetType()).Properties;
|
|
for (int i = 0; i < properties.Length; i++)
|
|
{
|
|
if (properties[i].MemberName == _memberName)
|
|
{
|
|
property = properties[i];
|
|
return fsResult.Success;
|
|
}
|
|
}
|
|
property = null;
|
|
return fsResult.Fail("No property named \"" + _memberName + "\" on " + instance.GetType().CSharpName());
|
|
}
|
|
|
|
public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType)
|
|
{
|
|
serialized = fsData.Null;
|
|
fsResult success = fsResult.Success;
|
|
fsMetaProperty property;
|
|
fsResult fsResult2 = (success += GetProperty(instance, out property));
|
|
if (fsResult2.Failed)
|
|
{
|
|
return success;
|
|
}
|
|
object instance2 = property.Read(instance);
|
|
return Serializer.TrySerialize(property.StorageType, instance2, out serialized);
|
|
}
|
|
|
|
public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType)
|
|
{
|
|
fsResult success = fsResult.Success;
|
|
fsMetaProperty property;
|
|
fsResult fsResult2 = (success += GetProperty(instance, out property));
|
|
if (fsResult2.Failed)
|
|
{
|
|
return success;
|
|
}
|
|
object result = null;
|
|
if ((success += Serializer.TryDeserialize(data, property.StorageType, ref result)).Failed)
|
|
{
|
|
return success;
|
|
}
|
|
property.Write(instance, result);
|
|
return success;
|
|
}
|
|
|
|
public override object CreateInstance(fsData data, Type storageType)
|
|
{
|
|
return fsMetaType.Get(storageType).CreateInstance();
|
|
}
|
|
}
|
|
}
|