我正在序列化这样的类
public MyClass
{
public int? a { get; set; }
public int? b { get; set; }
public int? c { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所有类型都可以为空,因为我希望在序列化此类对象时存储最少的数据.但是,当它仅使用"a"进行序列化时,我得到以下xml
<MyClass ...>
<a>3</a>
<b xsi:nil="true" />
<c xsi:nil="true" />
</MyClass>
Run Code Online (Sandbox Code Playgroud)
如何将此设置为仅获取非null属性的xml?期望的输出将是
<MyClass ...>
<a>3</a>
</MyClass>
Run Code Online (Sandbox Code Playgroud)
我想排除这些空值,因为会有几个属性,这是存储在数据库中(是的,这不是我的调用)所以我想保持未使用的数据最小.
我知道ShouldSerialize*模式和*Specified模式以及它们是如何工作的,但两者之间有什么区别吗?
当某些事情应该有条件地序列化时,是否有任何"陷阱"使用一种方法而不是另一种方法?
此问题仅供使用XmlSerializer,但也欢迎有关此主题的一般信息.
关于这个主题的信息非常少,因此可能是因为它们执行完全相同的目的而且它是一种风格选择.然而,看起来奇怪的是.NET实现者会通过反射来分析类,并查找其中一个/两个模式来确定生成的序列化程序的行为,因为它会减慢序列化程序的生成速度,除非它只是一个向后兼容性工件.
编辑: 对于那些不熟悉这两个模式的人,如果*Specified属性或ShouldSerialize*方法返回true,则该属性被序列化.
public string MyProperty { get; set; }
//*Specified Pattern
[XmlIgnore]
public bool MyPropertySpecified { get{ return !string.IsNullOrWhiteSpace(this.MyProperty); } }
//ShouldSerialize* Pattern
public bool ShouldSerializeMyProperty()
{
return !string.IsNullOrWhiteSpace(this.MyProperty);
}
Run Code Online (Sandbox Code Playgroud) 我在可序列化类中添加了一些可以为null的值类型.我执行序列化使用XmlSerializer但是当值设置为时null,我得到一个空节点xsi:nil="true".这是我在Xsi中找到的正确行为:nil属性绑定支持.
有没有办法关闭此选项,以便在值类型为时输出任何内容null?
我Serializable为检查员创建了一个类。
[Serializable]
public class CellType
{
[SerializeField]
public int? Cost; // This does not appear in the inspector
[SerializeField]
public Color MaterialColor;
}
Run Code Online (Sandbox Code Playgroud)
可为空的字段Cost不会出现在检查器中。我通过创建一个SerializeField
[SerializeField]
private CellType[] types;
Run Code Online (Sandbox Code Playgroud)
如果该字段Cost为默认int,则该字段将出现。有解决方法吗?
我正在尝试Nullable<bool>从我的 XML 文件中反序列化 a 。我的期望是在我的 XMLElement 中找不到的 XMLAttribute 是null,如果找到,它将是true或false。序列化也一样。如果它不为空,我的变量将被写入。
无论如何,每次我试图反序列化我的 XML 时,InvalidOperationException都会被抛出。
我的班级看起来像这样
[XMLArray("Users")]
public class User
{
[XMLAttribute("copy")]
public bool? copy;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个用于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)