上图是visual studio 2022 中使用的粘贴功能的菜单位置
在生成的xml 中,有些是类似如下类型的
cs
[System.Serializable]
[System.Xml.Serialization.XmlType]
public class Item
{
private bool isVisibleField;
private bool isVisibleFieldSpecified;
[System.Xml.Serialization.XmlElement]
public bool isVisible
{
get => isVisibleField;
set => isVisibleField = value;
}
[System.Xml.Serialization.XmlIgnore]
public bool isVisibleSpecified
{
get => isVisibleFieldSpecified;
set => isVisibleFieldSpecified = value;
}
}
从图中可以看到有IsVisible 、IsVisibleSpecified 两个,而实际的xml 中其实只有IsVisible 属性,那么为什么会出现IsVisibleSpecified 呢?这是因为标识这个IsVisible 属性是可选的属性。所以在
对这个属性进行序列化的时候,要注意,设置值的时候需要给IsVisibleSpecified 设置值,给IsVisible 属性设置值的化,在类序列化为xml 的时候,是没有效果的。
下边是一个列子,可以直观的看出来效果
cs
using System;
using System.IO;
using System.Xml.Serialization;
public class Program
{
public static void Main()
{
Item item = new Item
{
isVisible = true,
isVisibleSpecified = true // Include in XML
};
XmlSerializer serializer = new XmlSerializer(typeof(Item));
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, item);
Console.WriteLine(writer.ToString());
}
// Example: Omitting the "isVisible" element
item.isVisibleSpecified = false;
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, item);
Console.WriteLine(writer.ToString());
}
}
}
[Serializable]
public class Item
{
private bool isVisibleField;
private bool isVisibleFieldSpecified;
[XmlElement]
public bool isVisible
{
get => isVisibleField;
set => isVisibleField = value;
}
[XmlIgnore]
public bool isVisibleSpecified
{
get => isVisibleFieldSpecified;
set => isVisibleFieldSpecified = value;
}
}
本文主要是让自己对这个问题有所记录。