如果找不到元素,我是否可以在C#中使用XmlSerializer反序列化?

我正在使用XmlSerializer在C#中将对象写入和读取到xml。 我目前使用属性XmlElementXmlIgnore来操作对象的序列化。

如果我的xml文件缺少我需要的xml元素,我的对象仍然反序列化(xml – > object)就好了。 如何指示(最好通过属性)某个字段是“必需的”?

这是我目前使用的示例方法:

 [XmlElement(ElementName="numberOfWidgets")] public int NumberThatIsRequired { set ...; get ...; } 

我理想的解决方案是添加类似XmlRequired属性的东西。

另外,对于哪些属性可用于操纵XmlSerializer的行为,是否有一个很好的参考?

我得到了第二部分的答案: “控制XML序列化的属性” 。

还在调查第一部分……

编辑:我强烈怀疑你不能通过XML反序列化本身做到这一点。 我刚刚在包含必需属性的示例模式上运行xsd.exe – 如果该属性被标记为可选,则它完全相同。 如果有一种方法需要设置属性,我希望在这种情况下实现它。

我怀疑你基本上只需要在反序列化之后validation你的对象树。 对于那个很抱歉…

我发现这样做的唯一方法是通过XSD。 您可以做的是在反序列化时进行validation:

 static T Deserialize(string xml, XmlSchemaSet schemas) { //List exceptions = new List(); ValidationEventHandler validationHandler = (s, e) => { //you could alternatively catch all the exceptions //exceptions.Add(e.Exception); throw e.Exception; }; XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add(schemas); settings.ValidationType = ValidationType.Schema; settings.ValidationEventHandler += validationHandler; XmlSerializer serializer = new XmlSerializer(typeof(T)); using (StringReader sr = new StringReader(xml)) using (XmlReader books = XmlReader.Create(sr, settings)) return (T)serializer.Deserialize(books); } 

出于可扩展性的原因, XmlSerializer在反序列化方面非常宽容; [DefaultValue]ShouldSerialize{Foo}{Foo}Specified类的东西主要序列化期间使用(exception为{Foo}Specified ,在反序列化期间设置以及在序列化期间查询)。

因此; 除非你实现IXmlSerializable并自己动手,否则没有一种简单的方法可以做到这一点。 damagednoob显示了一个xsd选项,这也是一个选项。