一种根据C#类验证XML的简便方法

时间:2015-04-01 06:55:41

标签: c# xml xsd deserialization xml-validation

我使用XML格式来保存我的C#项目的设置。 这些XML被反序列化为C#类。

通常,类设计会发生变化但我忘记更新XML。反序列化通常可以正常工作,缺少的元素只能获得默认值。

这种行为对我来说是不可取的。 我希望自动验证断言类,并且XML具有完全相同的结构。

我知道我可以为我的类创建XML模式(例如使用XSD),但我无法想出一种简单的方法来自动完成它而不是手动(经常回忆我的类的设计更改)。此外,这种解决方案似乎有点不自然。我真的不需要XML模式。我有类及其序列化的XML实例。添加模式似乎是多余的。

非常感谢。

3 个答案:

答案 0 :(得分:0)

为什么你不在你的设置类中创建一个可以在xml反序列化后调用的方法?

假设你有一个这样的类:

class Settings {
    public string Property1 { get; set; }
    public int Property2 { get; set; }

    public bool IsValid() {
        if(string.IsNullOrEmpty(Property1)) return false;
        if(Property2 == 0) return false;
    }
}

使用 IsValid ,您可以查看班级中的所有内容。请记住,这是一个例子。我认为管理对象验证很好。如果您在时间内更改了某些内容,则可以编辑验证方法以检查新情况。

答案 1 :(得分:0)

为了配合罗伯托的想法并更进一步,你可以通过反思得到所有的属性:

var props = yourClass.GetType().GetProperties()

在您的验证功能中,您可以使用以下内容遍历这些属性:

foreach(var prop in props) // or foreach(var prop in yourClass.GetType().GetProperties())
{
   //...Validation of property
}

如果其中一个属性具有其标准值,则会抛出一个自定义异常,告知您没有正确更新XML文件。

答案 2 :(得分:0)

您可以使用版本容忍序列化(VTS)https://msdn.microsoft.com/en-us/library/ms229752%28v=vs.110%29.aspx

来实现此目的

序列化回调是您在VTS功能中寻找的