У меня есть набор классов .net, которые я в настоящее время сериализую и использую с кучей другого кода, поэтому формат этого xml относительно фиксирован (формат # 1).Мне нужно сгенерировать XML в другом формате (формат № 2), который имеет довольно похожую структуру, но не совсем то же самое, и мне интересно, как лучше всего это сделать.
Например, скажем, что это мои классы:
public class Resource
{
public string Name { get; set; }
public string Description { get; set; }
public string AnotherField { get; set; }
public string AnotherField2 { get; set; }
public Address Address1 { get; set; }
public Address Address2 { get; set; }
public Settings Settings { get; set; }
}
public class Address
{
public string Line1 { get; set; }
public string Line2 { get; set; }
public string City { get; set; }
}
// This class has custom serialization because it's sort-of a dictionary.
// (Maybe that's no longer needed but it seemed necessary back in .net 2.0).
public class Settings : IXmlSerializable
{
public string GetSetting(string settingName) { ... }
public string SetSetting(string settingName, string value) { ... }
public XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader)
{
// ... reads nested <Setting> elements and calls SetSetting() appropriately
}
public void WriteXml(XmlWriter writer)
{
// ... writes nested <Setting> elements
}
}
Я обычно использую стандартную XmlSerialization, и она производит отличный XML (формат # 1).Примерно так:
<Resource>
<Name>The big one</Name>
<Description>This is a really big resource</Description>
<AnotherField1>ADVMW391</AnotherField1>
<AnotherField2>green</AnotherField2>
<Address1>
<Line1>1 Park Lane</Line1>
<Line2>Mayfair</Line2>
<City>London</City>
</Address1>
<Address2>
<Line1>11 Pentonville Rd</Line1>
<Line2>Islington</Line2>
<City>London</City>
</Address2>
<Settings>
<Setting>
<Name>Height</Name>
<Value>12.4</Value>
</Setting>
<Setting>
<Name>Depth</Name>
<Value>14.1028</Value>
</Setting>
</Settings>
</Resource>
Новый XML, который я хочу сгенерировать (формат # 2), выглядит как текущий XML, за исключением:
Вместо поля AnotherField
и AnotherField2
, теперь они должны быть представлены как Настройки.то есть, как если бы SetSetting () был вызван дважды перед сериализацией, поэтому значения появляются как новые элементы внутри.
Вместо полей Address1
и Address2
они должны быть представлены какэлемент, содержащий два элемента.У элементов должен быть дополнительный атрибут или два, например Position и AddressType.
например
<Resource>
<Name>The big one</Name>
<Description>This is a really big resource</Description>
<Addresses>
<Address>
<Line1>1 Park Lane</Line1>
<Line2>Mayfair</Line2>
<City>London</City>
<Position>1</Position>
<AddressType>Postal</AddressType>
</Address>
<Address>
<Line1>11 Pentonville Rd</Line1>
<Line2>Islington</Line2>
<City>London</City>
<Position>2</Position>
<AddressType>Postal</AddressType>
</Address>
</Addresses>
<Settings>
<Setting>
<Name>Height</Name>
<Value>12.4</Value>
</Setting>
<Setting>
<Name>Depth</Name>
<Value>14.1028</Value>
</Setting>
<Setting>
<Name>AnotherField</Name>
<Value>ADVMW391</Value>
</Setting>
<Setting>
<Name>AnotherField2</Name>
<Value>green</Value>
</Setting>
</Settings>
</Resource>
Могу ли я использовать XmlAttributeOverrides для управления сериализацией таким образом?Иначе как мне подойти?
Имейте в виду, что мои реальные классы имеют по крайней мере в 10 раз больше полей, и есть некоторые вложенные классы, где я полностью доволен сериализацией по умолчанию, поэтому я хотел бы избежать слишком большого количества ручногокод сериализации.
Возможные параметры
Я вижу следующие параметры:
- Возможно, можно использовать переопределения для управления сериализацией только тех атрибутов, которые мне нужныоколо?
- Пользовательская сериализация класса Resource для формата # 2, при необходимости вызывающая сериализацию вложенных классов по умолчанию.Не знаю, как обращаться с настройками, так как я действительно хочу добавить настройки, сериализовать с использованием параметров по умолчанию, затем удалить добавленные настройки.
- Создать XML с использованием сериализации по умолчанию, а затем манипулировать XML, чтобы внести необходимые изменения.(ick!).
Другое небольшое осложнение заключается в том, что Resource
из моего примера выше имеет два подтипа, каждый с парой дополнительных полей.Сериализация по умолчанию обрабатывает это приятно.Любой новый метод также должен иметь дело с сериализацией этих подтипов.Это означает, что я не заинтересован в решении, которое подразумевает создание разных подтипов исключительно для целей сериализации.