The*_*ght 2 c# xml asp.net serialization
我有一个用于Xml序列化的类.
在其中我有一个可以使用XmlAttribute修饰的可空属性:
[XmlAttribute("lastUpdated")]
public DateTime? LastUpdated { get; set; }
Run Code Online (Sandbox Code Playgroud)
如果属性为null或为空,如何忽略序列化的属性?
我已经尝试过以下但是当有值时它不会序列化(总是忽略):
[XmlIgnore]
public DateTime? LastUpdatedValue { get; set; }
[XmlAttribute("lastUpdated")]
public DateTime LastUpdated { get; set; }
public bool ShouldSerializeLastUpdated()
{
return LastUpdatedValue.HasValue;
}
Run Code Online (Sandbox Code Playgroud)
bin*_*ard 10
XmlSerialization不直接支持Nullable.
如果要使用可为空的属性,则必须使用非可空属性,并添加具有相同名称的属性的布尔属性,后缀为"已指定",在属性必须可序列化时指定.
您的案例的一个例子:
private DateTime? _lastUpdated;
[XmlAttribute("lastUpdated")]
public DateTime LastUpdated {
get {
return (DateTime)_lastUpdated;
}
set
{
_lastUpdated = value;
}
}
public bool LastUpdatedSpecified
{
get
{
return _lastUpdated.HasValue;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这个话题很老。这是我附带的解决方案。封装类型并隐式转换为类型的类。序列化时,成员变量可以标记为IsNullable = false,而不会出现编译器错误,并且在null时阻止其被序列化。
public class Optional<T> where T : struct, IComparable
{
public Optional(T valueObject)
{
Value = valueObject;
}
public Optional()
{
}
[XmlText]
public T Value { get; set; }
public static implicit operator T(Optional<T> objectToCast)
{
return objectToCast.Value;
}
public static implicit operator Optional<T>(T objectToCast)
{
return new Optional<T>(objectToCast);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在课堂上使用它
[Serializable]
[XmlRoot(ElementName = "foo")]
public class foo
{
[XmlElement(ElementName = "myInteger", isNullable = false)]
Optional<int> myInt;
}
Run Code Online (Sandbox Code Playgroud)
你可以做类似的事情
myFoo.myInt = 7;
int j = 8 + myFoo.myInt;
Run Code Online (Sandbox Code Playgroud)
出于所有目的,它都是一个int。出于序列化的目的,它可以为null并被阻止序列化。
| 归档时间: |
|
| 查看次数: |
19049 次 |
| 最近记录: |