从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;元素工作正常。有什么想法吗?
答案 0 :(得分:3)
问题是该属性没有setter。即使有可能将值序列化,也无法对其进行反序列化,因为无法将值重新放回新对象中。
答案 1 :(得分:1)
按照设计,XML Serialization只会序列化公共读/写属性和公共字段。
答案 2 :(得分:0)
不确定问题是什么(我总是发现XML序列化程序行为很狡猾),但为什么不使用Nullable<T>
类呢?不要重新发明轮子:)