Это может быть достигнуто с помощью XmlAttributeOverrides .
Ниже приведен базовый пример, GetOverrides()
является важной частью:
public class RailsXmlSerializer
{
private Type type;
public RailsXmlSerializer(Type type)
{
this.type = type;
}
public void Serialize(Stream stream, object o)
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer xmlSerializer = new XmlSerializer(type, GetOverrides(type));
xmlSerializer.Serialize(stream, o, ns);
}
public object Deserialize(Stream stream)
{
XmlSerializer xmlSerializer = new XmlSerializer(type, GetOverrides(type));
return xmlSerializer.Deserialize(stream);
}
private XmlAttributeOverrides GetOverrides(Type type)
{
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes classAttributes = new XmlAttributes();
classAttributes.XmlType = new XmlTypeAttribute(type.Name.ToLower());
overrides.Add(type, classAttributes);
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(type))
{
XmlAttributes propertyAttributes = new XmlAttributes();
propertyAttributes.XmlElements.Add(new XmlElementAttribute(property.Name.ToLower().Replace('_', '-')));
overrides.Add(type, property.Name, propertyAttributes);
}
return overrides;
}
}
Очевидно, что это должна быть более надежная реализация, возможно, в качестве декоратора для XmlSerializer , с проверкой ошибок и типов. Конечно, GetOverrides()
также может быть настроен для получения желаемого результата. Тем не менее, вот результирующий вывод с учетом образца Person
объекта:
<?xml version="1.0" encoding="utf-16"?>
<person>
<first-name>Jason</first-name>
<last-name>Bourne</last-name>
<active>true</active>
</person>
И, учитывая этот ввод, десериализация также выполняется правильно, чтобы обеспечить надлежащий объект Person.