前の質問に続いて、提案された Lazy<T> ジェネリックを XML シリアライゼーションと組み合わせるのに問題があります。
Lazy<T> に使用している機能は次のとおりです。
public struct Lazy<T> where T : class, new()
{
private T _Value;
public bool HasValue
{
get
{
return (_Value != null);
}
}
public T Value
{
get
{
if (!HasValue)
_Value = new T();
return _Value;
}
}
}
現在、MSDN ドキュメントでは、プロパティに [XmlElement("ElementName")] を使用しても問題ないと書かれており、実際に問題なく逆シリアル化できるようです。問題は、オブジェクトをシリアル化するときに発生します。次のコードを実行しています。
class SomeClass
{
[XmlElement("ExternalElementName")]
public ComplexElementType InternalElementName
{
get { return _InternalElementName.Value; }
}
protected Lazy<ComplexElementType> _InternalElementName;
}
他の場所:
SomeClass someClass = new SomeClass();
someClass.InternalElementName.ComplexElementTypeChild = "some string";
// serialize...
奇妙なことに、これはデバッガーでは正常に機能しますが、XML には要素が出力されません。非 Lazy<T> 要素は正常に機能します。何か案は?