2010-11-28 3 views
8

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

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

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

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; } 

Спасибо.


Редактировать Поскольку не было представлено никакого решения, как я искал, я, наконец, решил сделать выбор в пользу решения «IXmlSerializable».

ответ

3

Вы можете:

  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(); 
        } 
    } 
    
+0

Ваш суррогатной собственность именно то, чего он пытается избежать. – SLaks 2010-11-28 23:08:08

Смежные вопросы