62 lines
No EOL
2.5 KiB
C#
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;
|
|
}
|
|
}
|
|
} |