.NET сериализация: передовая практика для сопоставления классов с элементами и свойств с атрибутами? - PullRequest
2 голосов
/ 23 октября 2010

Я пытаюсь сериализовать следующий объект:

[XmlRoot("book")]
public class Book
{
    #region Properties
    [XmlAttribute("isbn-10")]
    public string Isbn10 { get; set; }
    [XmlAttribute("isbn-13")]
    public string Isbn13 { get; set; }
    [XmlAttribute("title")]
    public string Title { get; set; }
    [XmlAttribute("author")]
    public string Author { get; set; }
    [XmlAttribute("collaborator")]
    public string Collaborator { get; set; }
    [XmlAttribute("publisher")]
    public string Publisher { get; set; }
    [XmlAttribute("publication")]
    public DateTime? Publication { get; set; }
    [XmlAttribute("pages")]
    public int Pages { get; set; }
    [XmlAttribute("instock")]
    public bool InStock { get; set; }
    #endregion

    #region Constructors
    public Book (string isbn10, string title, string author, string publisher, DateTime publication, int pages, bool instock=true, string isbn13="N/A", string collaborator="N/A")
    {
        this.Isbn10 = isbn10;
        this.Isbn13 = isbn13;
        this.Author = author;
        this.Collaborator = collaborator;
        this.Publisher = publisher;
        this.Publication = publication;
        this.Pages = pages;
        this.InStock = instock;
    }

    public Book ()
    {
        // To be serialized by an XmlSerializer object, a class must have a default constructor.
        // For additional information about XML Serialization Considerations, visit the following
        // Microsoft Web site: http://msdn2.microsoft.com/en-us/library/182eeyhh(vs.71).aspx
    }
    #endregion
}

Пытаюсь реализовать объекты к элементам и свойства к атрибутам вид стратегии, но, как вы, вероятно, заметите,результаты показывают, что я не совсем там, так как компилятор по праву запрещает мне устанавливать атрибут [XmlElement("book")] для класса Book.

<?xml version="1.0" encoding="utf-16"?>
<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            isbn-10="1577315936"
            isbn-13="N/A"
            author="Joseph Campbell"
            collaborator="N/A"
            publisher="New World Library"
            publication="2008-07-28T00:00:00"
            pages="432"
            instock="true"
/>

Я подумал о создании, скажем, List<Book>объект с очевидной идеей наличия корневого элемента <books > для сериализации, но с одной стороны, я не совсем уверен, сработает ли это на самом деле, а с другой стороны, это, вероятно, сделает сериализацию зависимой от фактической реализации.

Буду очень признателен за любые советы, которые вы, ребята, могли бы счесть полезными, включая изменение стратегии сериализации и т. Д.

Заранее большое спасибо,

1 Ответ

3 голосов
/ 23 октября 2010

Вы можете (например) использовать объект-контейнер, чтобы упростить управление "книгами".

[XmlRoot("books"), XmlType("books")]
public class Library
{
    private readonly List<Book> books;
    [XmlElement("book")]
    public List<Book> Books {get{return books;}}
}

Другой вариант (для двух уровней) - XmlArray / XmlArrayItem.

...