XML序列化不会写出延迟评估的属性

时间:2009-09-08 11:04:02

标签: c# serialization xml-serialization lazy-evaluation

previous question开始,我在组合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 Docs说在一个属性上有一个[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中没有输出任何元素。非懒惰&lt; T&gt;元素工作正常。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

问题是该属性没有setter。即使有可能将值序列化,也无法对其进行反序列化,因为无法将值重新放回新对象中。

答案 1 :(得分:1)

按照设计,XML Serialization只会序列化公共读/写属性和公共字段。

答案 2 :(得分:0)

不确定问题是什么(我总是发现XML序列化程序行为很狡猾),但为什么不使用Nullable<T>类呢?不要重新发明轮子:)