Простая C # Xml сериализация - PullRequest
2 голосов
/ 02 сентября 2010

У меня есть класс:

public class Car {

   public string Model {get;set;}

   public string SeatFinish {get;set;}

   public string Audio {get;set;}
}

Я хочу использовать атрибуты сериализации XML, чтобы сериализовать его в следующий xml

<Car>
  <Model>name</Model>
  <Options>
   <SeatFinish>Leather</SeatFinish>
   <Audio>5 speaker</Audio>
  </Options>
</Car>

По причинам, характерным для проекта, я не могу просто создать свойство:

public List<string> Options; 

Есть ли способ указать с помощью атрибутов, что свойство должно быть сериализовано для определенного элемента XML (в данном случае это узел "Опции")? Могу ли я написать собственный атрибут, который позволяет это? Любой совет приветствуется.

редактировать:

Я вижу, что наличие класса параметров будет работать, но есть ли какой-то способ добиться этого без создания других классов? например, я могу захотеть сделать это только с одним свойством.

в идеале я бы хотел иметь возможность указать

[Parent("Options")]
public string SeatFinish {get;set;}

Ответы [ 5 ]

5 голосов
/ 02 сентября 2010

Является ли это частью модели предметной области или аналогичной? Похоже, вы захотите, чтобы эти опции можно было повторно использовать за пределами автомобильного объекта, так почему бы не создать отдельный класс Options?

public class Options
{
   public string SeatFinish {get;set;}
   public string Audio {get;set;}
}

И измените свой Car класс на класс Options:

public class Car 
{
   public string Model {get;set;}
   public Options Options {get;set;}
}
3 голосов
/ 02 сентября 2010

Если возможно, попробуйте изменить класс на это:

public class Car {

    public class CarOptions
    {
        public string SeatFinish { get; set; }
        public string Audio { get; set; }
    }

    public string Model { get; set; }
    public CarOptions Options { get; set; }

    public Car()
    {
        this.Options = new CarOptions();
    }
}
2 голосов
/ 02 сентября 2010

Я считаю, что для того, чтобы получить то, что вам нужно, вам потребуется реализовать IXmlSerializable и сериализовать объект самостоятельно.

См .: Настраиваемая XML-сериализация .

Сначала реализовать интерфейс:

public class Car : IXmlSerializable
{
    // Private state
    public string Model { get; set; }
    public string SeatFinish { get; set; }
    public string Audio { get; set; }

    public Car()
    {
        Model = "Toyota";
        SeatFinish = "Leather";
        Audio = "Awesome Soundz";
    }

...

Затем реализуйте пользовательскую сериализацию.В классе XmlWriter есть много методов для быстрого и умного создания XML, однако я использовал здесь WriteRaw () для простоты.

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteRaw("<Model>" + this.Model + "</Model>");
        writer.WriteRaw("<Options>");
        writer.WriteRaw("<SeatFinish>" + this.SeatFinish + "</SeatFinish>");
        writer.WriteRaw("<Audio>" + this.Audio + "</Audio>");
        writer.WriteRaw("</Options>");
    }

    public void ReadXml(XmlReader reader) { ... }
}

Затем реализуйте соответствующий метод ReadXml () для десериализации вашего объекта XMLпредставление.Я бы порекомендовал использовать класс System.Xml.XPath.XPathNavigator, чтобы упростить работу по десериализации XML, но в любом случае в классе XMLReader имеется множество простых старых методов, которые вы, вероятно, могли бы получить для надуманного примера.

1 голос
/ 02 сентября 2010

Я думаю, что вы используете стандартную механизацию XML-сериализации. В этом случае взгляните на IXmlSerializable Interface . Это позволяет добавить ловушки сериализации в существующую механику сериализации XML. Затем вы можете изменить представление XML, не касаясь существующей объектной модели.

0 голосов
/ 02 сентября 2010

Взгляните на этот предыдущий пост.

C # Сериализация XML

Я считаю, что смешивать его с тем, что GenericTypeTea сказал, является лучшим.

Надеюсь, это поможет.

...