上图是visual studio 2022 中使用的粘贴功能的菜单位置
在生成的xml 中,有些是类似如下类型的
[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 的时候,是没有效果的。
下边是一个列子,可以直观的看出来效果
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" elementitem.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;}
}
本文主要是让自己对这个问题有所记录。