pixelgon/Assets/Source/Converters/fsKeyValuePairConverter.cs
2020-06-05 11:54:36 -07:00

62 lines
No EOL
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
namespace FullSerializer.Internal {
public class fsKeyValuePairConverter : fsConverter {
public override bool CanProcess(Type type) {
return
type.Resolve().IsGenericType &&
type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>);
}
public override bool RequestCycleSupport(Type storageType) {
return false;
}
public override bool RequestInheritanceSupport(Type storageType) {
return false;
}
public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) {
var result = fsResult.Success;
fsData keyData, valueData;
if ((result += CheckKey(data, "Key", out keyData)).Failed) return result;
if ((result += CheckKey(data, "Value", out valueData)).Failed) return result;
var genericArguments = storageType.GetGenericArguments();
Type keyType = genericArguments[0], valueType = genericArguments[1];
object keyObject = null, valueObject = null;
result.AddMessages(Serializer.TryDeserialize(keyData, keyType, ref keyObject));
result.AddMessages(Serializer.TryDeserialize(valueData, valueType, ref valueObject));
instance = Activator.CreateInstance(storageType, keyObject, valueObject);
return result;
}
public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) {
PropertyInfo keyProperty = storageType.GetDeclaredProperty("Key");
PropertyInfo valueProperty = storageType.GetDeclaredProperty("Value");
object keyObject = keyProperty.GetValue(instance, null);
object valueObject = valueProperty.GetValue(instance, null);
var genericArguments = storageType.GetGenericArguments();
Type keyType = genericArguments[0], valueType = genericArguments[1];
var result = fsResult.Success;
fsData keyData, valueData;
result.AddMessages(Serializer.TrySerialize(keyType, keyObject, out keyData));
result.AddMessages(Serializer.TrySerialize(valueType, valueObject, out valueData));
serialized = fsData.CreateDictionary();
if (keyData != null) serialized.AsDictionary["Key"] = keyData;
if (valueData != null) serialized.AsDictionary["Value"] = valueData;
return result;
}
}
}