Декларативно определить сериализацию XML с помощью POCOS - PullRequest
2 голосов
/ 20 января 2011

Обычно в C # Xml типы помечаются атрибутами для определения способа их получения. сериализованная:

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(Namespace=
"urn:xmlns:25hoursaday-com:my-bookshelf")]
public class bookType {

    /// <remarks/>
    public string title;

    /// <remarks/>
    public string author;

   /// <remarks/>
   [System.Xml.Serialization.XmlElementAttribute("publication-date", 
DataType="date")]      
    public System.DateTime publicationdate;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string publisher;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute("on-loan")]
    public string onloan;
}

Теперь, когда дело доходит до того, что мне нравится использовать POCOS без этих атрибутов, которые я потенциально мог бы повторно использовать для выполнения OR-Mapping с, например, NHibernate, тогда было бы неплохо определить способ сериализации таким образом, чтобы не изменять типы для сериализации.

Вопрос заключается в следующем: существует ли способ, чтобы declerativeley определить способ сериализации типа, например, в виде XML-файла сопоставления.

1 Ответ

1 голос
/ 20 января 2011

Да

    XmlAttributeOverrides attribs = new XmlAttributeOverrides();
    attribs.Add(typeof(bookType), new XmlAttributes
    {
        XmlType = new XmlTypeAttribute { Namespace = "urn:xmlns:25hoursaday-com:my-bookshelf" },
    });
    attribs.Add(typeof(bookType), "publicationdate", new XmlAttributes
    {
        XmlElements = { new XmlElementAttribute("publication-date") { DataType = "date" } }
    });
    attribs.Add(typeof(bookType), "publisher", new XmlAttributes
    {
        XmlAttribute = new XmlAttributeAttribute()
    });
    attribs.Add(typeof(bookType), "onloan", new XmlAttributes
    {
        XmlAttribute = new XmlAttributeAttribute("on-loan")
    });

Затем сериализуйте с:

    XmlSerializer s = new XmlSerializer(typeof(bookType), attribs);
    var obj = new bookType { title = "a", author = "b",
        publicationdate = DateTime.Now, publisher = "c", onloan = "d"};
    s.Serialize(Console.Out, obj);

ОДНАКО

и я не могу предупредить это достаточно сильно; Вы должны кэшировать и повторно использовать объекты XmlSerializer, созданные таким образом, поскольку каждый из них создает динамическую сборку сериализации, которую нельзя выгрузить . Если вы не кешируете и не используете повторно, вы переполните память.

...