Якщо вам потрібно обробити конкретні атрибути (наприклад, словник або будь-який клас), ви можете реалізувати інтерфейс IXmlSerialiable , який дозволить вам отримати більше свободи за рахунок більш детального кодування .
public class NetService : IXmlSerializable
{
#region Data
public string Identifier = String.Empty;
public string Name = String.Empty;
public IPAddress Address = IPAddress.None;
public int Port = 7777;
#endregion
#region IXmlSerializable Implementation
public XmlSchema GetSchema() { return (null); }
public void ReadXml(XmlReader reader)
{
// Attributes
Identifier = reader[XML_IDENTIFIER];
if (Int32.TryParse(reader[XML_NETWORK_PORT], out Port) == false)
throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_PORT);
if (IPAddress.TryParse(reader[XML_NETWORK_ADDR], out Address) == false)
throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_ADDR);
}
public void WriteXml(XmlWriter writer)
{
// Attributes
writer.WriteAttributeString(XML_IDENTIFIER, Identifier);
writer.WriteAttributeString(XML_NETWORK_ADDR, Address.ToString());
writer.WriteAttributeString(XML_NETWORK_PORT, Port.ToString());
}
private const string XML_IDENTIFIER = "Id";
private const string XML_NETWORK_ADDR = "Address";
private const string XML_NETWORK_PORT = "Port";
#endregion
}
Є цікава стаття , в якій показаний елегантний спосіб реалізувати складний спосіб "розширити" XmlSerializer.
У статті сказано:
IXmlSerializable міститься в офіційній документації, однак у документації зазначено, що він не призначений для публічного використання та не надає жодної інформації, що перевищує це. Це вказує на те, що команда розробників хотіла залишити за собою право змінювати, вимикати або навіть повністю видаляти цю гачку розширення вниз по дорозі. Однак, поки ви готові прийняти цю невизначеність і боротися з можливими змінами в майбутньому, немає жодної причини, якою ви не можете скористатися нею.
Тому що це, я пропоную вам реалізувати свій власний IXmlSerializable
класи, щоб уникнути занадто складних реалізацій.
... це може бути просто реалізувати наш спеціальний XmlSerializer
клас, використовуючи рефлексію.