我正在使用XmlSerializer在C#中写入和读取对象。我目前使用属性XmlElement
和XmlIgnore
来操作对象的序列化。
如果我的xml文件缺少我需要的xml元素,我的对象仍然可以很好地反序列化(xml ->对象)。如何指示(最好是通过属性)某个字段是“必需的”?
下面是我当前使用的示例方法:
[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
set ...;
get ...;
}
我理想的解决方案是添加一个类似于XmlRequired
属性的东西。
另外,对于哪些属性可用于操作XmlSerializer的行为,有没有很好的参考资料?
发布于 2008-11-03 11:58:49
对于第二部分,我有一个答案:"Attributes that control XML serialization"。
仍在调查第一部分...
编辑:我强烈怀疑您不能通过XML反序列化本身来做到这一点。我刚刚在一个示例模式上运行了xsd.exe,该模式包含一个必需的属性-如果该属性被标记为可选,则它完全相同。如果有一种方法需要设置属性,我希望在这种情况下实现它。
我怀疑你基本上只需要在反序列化之后验证你的对象树。很抱歉..。
发布于 2008-11-03 13:10:23
我找到的唯一方法就是通过XSD。你能做的就是在反序列化的同时进行验证:
static T Deserialize<T>(string xml, XmlSchemaSet schemas)
{
//List<XmlSchemaException> exceptions = new List<XmlSchemaException>();
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);
}
发布于 2008-11-03 21:10:25
出于可扩展性的原因,XmlSerializer
在进行反序列化时非常宽容;像[DefaultValue]
、ShouldSerialize{Foo}
和{Foo}Specified
这样的东西主要在序列化期间使用(例外是{Foo}Specified
,它是在反序列化期间设置的,并且在序列化期间被查询)。
因此,没有一种简单的方法可以做到这一点,除非您实现了IXmlSerializable
并亲自动手。Richard显示了xsd选项,这也是一个选项。
https://stackoverflow.com/questions/259726
复制