1

前の質問に続いて、提案された 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> 要素は正常に機能します。何か案は?

4

3 に答える 3

3

問題は、プロパティにセッターがないことです。シリアル化する値を取得できたとしても、値を新しいオブジェクトに戻す方法がないため、逆シリアル化することはできません。

于 2009-09-08T11:16:07.300 に答える
1

設計上、XML シリアライゼーションは、パブリックの読み取り/書き込みプロパティとパブリック フィールドのみをシリアル化します。

于 2009-09-09T10:11:31.367 に答える
0

何が問題なのかわからない (私は常に XML シリアライザーの動作が不安定であることに気付きました) が、なぜこのNullable<T>クラスを使用しないのでしょうか? 車輪を再発明しないでください:)

于 2009-09-08T11:07:16.880 に答える