Nếu bạn cần xử lý các thuộc tính cụ thể (ví dụ: Từ điển hoặc bất kỳ lớp nào), bạn có thể triển khai giao diện IXmlSerialiable , điều này sẽ cho phép bạn tự do hơn với chi phí mã hóa dài hơn .
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
}
Có một bài viết thú vị , trong đó cho thấy một cách thanh lịch để thực hiện một cách tinh vi để "mở rộng" XmlSerializer.
Bài báo nói:
IXmlSerializable được đề cập trong tài liệu chính thức, nhưng tài liệu nói rằng nó không dành cho sử dụng công cộng và không cung cấp thông tin nào ngoài điều đó. Điều này chỉ ra rằng nhóm phát triển muốn bảo lưu quyền sửa đổi, vô hiệu hóa hoặc thậm chí loại bỏ hoàn toàn móc mở rộng này xuống đường. Tuy nhiên, miễn là bạn sẵn sàng chấp nhận sự không chắc chắn này và đối phó với những thay đổi có thể xảy ra trong tương lai, không có lý do gì bạn không thể tận dụng lợi thế của nó.
Bởi vì điều này, tôi đề nghị thực hiện IXmlSerializable
các lớp của riêng bạn , để tránh việc triển khai quá phức tạp.
... nó có thể đơn giản để thực hiện XmlSerializer
lớp tùy chỉnh của chúng ta bằng cách sử dụng sự phản chiếu.