Как создать свою собственную сериализацию XmlAttribute - PullRequest
8 голосов
/ 29 ноября 2010

Я смотрю, кому настроить сериализацию атрибута.Я думал, что это будет просто, но я не смог достичь того, что хотел сделать, так, как я хотел.

Итак, вот простой пример:

Определение класса:

Class MyClass
{
    [XmlAttribute("myAttribute")]
    public int[] MyProperty { get; set; }
}

Xml Результат, который я хотел бы получить:

<MyClass myAttribute="1 2 3... N" />

Единственное, что мне удалось сделать, - это добавить атрибут [XmlIgnore] и создать другое свойство с некоторым кодом, который выполнял преобразование.

Итак, мой вопрос, есть ли лучший способ, чем создать новое свойство?Может быть, есть какой-нибудь TypeConverter, который вы можете создать, чтобы сериализатор использовал его?

Кроме того, я пытался использовать атрибут Type, но безуспешно.(Всегда получаю исключения).Но из того, что я прочитал, это для уже определенного типа данных.

[XmlAttribute("myAttribute", typeof(MyConverter))]
public int[] MyProperty { get; set; }

Другой интересный способ был бы таким:

[XmlAttribute("myAttribute")]
[XmlConverter(typeof(MyConverter))]
public int[] MyProperty { get; set; }

Спасибо.


Edit Поскольку решение, которое я искал, не было представлено, я, наконец, решил выбрать решение "IXmlSerializable".

1 Ответ

3 голосов
/ 29 ноября 2010

Вы можете либо:

  1. Реализация IXmlSerializable и справиться со всеми сериализация / десериализация для ваш тип вручную
  2. Используйте суррогатное свойство:

    [XmlIgnore]
    public int[] MyProperty { get; set; }
    
    
    [XmlAttribute("myAttribute")]
    public string _MyProperty
    {
        get
        {
            return string.Join(" ", MyProperty.Select(x => x.ToString()).ToArray());
        }
        set
        {
            MyProperty = value.Split(' ').Select(x => int.Parse(x)).ToArray();
        }
    }
    
...