Если это прямая карта, вы должны просто иметь возможность использовать ее напрямую, если типы доступны как public и имеют открытые конструкторы без параметров, а свойства (включая списки) - get / set.
Если вам нужно настроить имена, есть конструктор XmlSerializer
, который позволяет вам указать все атрибуты. Это идеально подходит для вашего сценария, но вы должны кэшировать и повторно использовать сериализатор, если вы используете эту перегрузку конструктора, в противном случае вы потеряете память (динамические сборки не будут собраны).
Вот полный пример, который удаляет одно свойство (XmlIgnore
), заменяет другое на атрибут и оставляет третье в качестве элемента.
using System;
using System.IO;
using System.Xml.Serialization;
public class Foo
{
public int A { get; set; }
public string B { get; set; }
public int C { get; set; }
}
static class Program
{
static readonly XmlSerializer serializer;
static Program()
{
XmlAttributeOverrides or = new XmlAttributeOverrides();
or.Add(typeof(Foo), "A", new XmlAttributes { // change to an attrib
XmlAttribute = new XmlAttributeAttribute("tweaked")
});
or.Add(typeof(Foo), "B", new XmlAttributes {
XmlIgnore = true // turn this one off
});
// leave C as a default named element
serializer = new XmlSerializer(typeof(Foo), or);
}
static void Main()
{
Foo foo = new Foo { A = 123, B = "def", C = 456 }, clone;
string xml;
using (StringWriter sw = new StringWriter())
{
serializer.Serialize(sw, foo);
xml = sw.ToString();
}
using (StringReader sr = new StringReader(xml)) {
clone = (Foo)serializer.Deserialize(sr);
}
Console.WriteLine(xml);
Console.WriteLine();
Console.WriteLine(clone.A);
Console.WriteLine(clone.B);
Console.WriteLine(clone.C);
}
}
Также обратите внимание, что если вам нужно только что-то изменить на уровне type (например, [XmlInclude]
), то вы можете сделать это с помощью partial class
, который генерирует LINQ-to-SQL; например:
namespace My.Dal.Namespace {
// add a type attribute to SomeEntity
[XmlInclude(typeof(SomeDerivedEntity))]
partial class SomeEntity { }
}