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をを「拡張」する洗練された方法を実装するためのエレガントな方法を示して面白いarticle、があります。
IXmlSerializableは公式ドキュメントで説明されていますが、ドキュメントは、それが公共の使用を意図していない状態と、それを超えた情報を提供しない:
記事は言います。これは、開発チームが、この拡張性を変更、無効化、または完全に削除する権利を確保したかったことを示しています。しかし、あなたがこの不確実性を受け入れ、将来の可能性のある変化に対処することができれば、それを利用できない理由は何もありません。
これは、あまりにも複雑な実装を避けるため、私はあなた自身のIXmlSerializable
クラスを実装することをお勧めします。
...リフレクションを使用してカスタムXmlSerializer
クラスを実装するのは簡単です。
オブジェクトにUriフィールドがあり、この例外が発生しました。 Uriクラスにはパラメータのないコンストラクタがありません。先端に感謝します。 – ford
Google検索でこれを見つけました。私の特有の問題は、リストにする必要があるときに、IListとしての「シリアライズ」クラスのプロパティを持つことでした。 –
「内部例外」をどのように見ますか? – David