Как правильно сохранить значение перечисления с помощью XmlSerializer (.NET), когда значение перечисления сохраняется как объект - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу сохранить объект, содержащий значение, которое может быть любого типа.Я использую 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);
    }
}

1 Ответ

0 голосов
/ 07 декабря 2018

Вы можете поместить атрибуты в свой enum

public enum Simple
{
      [XmlEnum(Name="First")]
      one,
      [XmlEnum(Name="Second")]
      two,
      [XmlEnum(Name="Third")]
      three,
}

Оригинал: Как использовать XMLSerialize для типизированных свойств Enum в c #?

...