Я хочу сохранить объект, содержащий значение, которое может быть любого типа.Я использую XmlSerializer, чтобы сделать это, и он отлично работает с одним исключением: если значение является enum, сериализатор сохраняет значение как целое число.Если я загружаю его обратно и использую это значение для чтения из словаря, я получаю KeyNotFoundException.
Есть ли какой-нибудь элегантный способ сохранить перечисление как enum или избежать KeyNotFoundException и при этом использовать XmlSerializer?(Приведение обратно к enum не является хорошим вариантом, контейнер и словарь должны поддерживать все типы)
Вот упрощенный фрагмент кода, который демонстрирует проблему:
public enum SomeEnum
{
SomeValue,
AnotherValue
}
// Adding [XmlInclude(typeof(SomeEnum))] is no proper solution as Key can be any type
public class GenericContainer
{
public object Key { get; set; }
}
private Dictionary<object, object> SomeDictionary = new Dictionary<object, object>();
public void DoSomething()
{
SomeDictionary[SomeEnum.AnotherValue] = 123;
var value = SomeDictionary[SomeEnum.AnotherValue];
Save(new GenericContainer { Key = SomeEnum.AnotherValue}, "someFile.xml");
var genericContainer = (GenericContainer)Load("someFile.xml", typeof(GenericContainer));
// Throws KeyNotFoundException
value = SomeDictionary[genericContainer.Key];
}
public void Save(object data, string filePath)
{
var serializer = new XmlSerializer(data.GetType());
using (var stream = File.Create(filePath))
{
serializer.Serialize(stream, data);
}
}
public object Load(string filePath, Type type)
{
var serializer = new XmlSerializer(type);
using (var stream = File.OpenRead(filePath))
{
return serializer.Deserialize(stream);
}
}