类数据验证的实现



我有一个代表某些风洞物理特性的对象:

public class Tunnel
{
    public double Length { get; set; }
    public double CrossSectionArea { get; set; }
    public double AirDensity { get; set; }
    public double Pressure { get; set; }
    //...
}

我需要检查参数的正确性:例如,Length必须是> 0,Pressure >= 0等等。第一个想法只是对属性访问器进行检查,并对无效数据抛出异常:

public class Tunnel
{
    private double length;
    public double Length
    {
        get { return length; }
        set
        {
            if (value <= 0)
                throw new TunnelParametersException("Invalid data");
            length = value;
        }
        //...
    }

但我有一个这样的对象的集合,它将被序列化/反序列化到XML文件/从XML文件反序列化。所以问题是它不能与序列化一起工作(如果我没有错的话)。用户可以编辑文件并输入任何他想要的,我将无法捕捉它。

因此,据我所知,需要创建一些函数(在Tunnel类或另一个类中),我将调用它来检查所有值是否正确。但这里还有一个问题:Tunnel可能有几个无效参数。我应该如何返回错误并进行处理?程序必须在一次调用中返回所有找到的错误。这种方式只适合我自己使用类。我可能不能强迫另一个程序员在每次编辑数据后使用验证。

请给我一个建议,如何更正确地实现这种值检查并解决我的问题——也许还有其他灵活的方法,以便在未来更容易管理和改进此代码。非常感谢。

EDIT:回到我的第一个想法,有什么方法可以在序列化期间或之后验证数据吗?

最简单的方法:

//Returns empty list if no errors.
public List<TunnelErrors> Validate()
{
    //Validate params
}

我想到的是这个。

我会保留一个只读的IsValid属性。在getter上,我会做所有的验证,说是真是假。

在我使用该对象的任何地方,我都会检查该对象是否存在。IsValid为true。

尝试让你的文件每次都通过包装器函数,并让磁盘上的文件对普通用户只读,即,如果用户必须编辑文件,他只能通过你的程序来编辑,当用户完成编辑后,你通过你的函数传过所有数据,看看整个数据是否仍然有效,

对于编辑:使序列化流通过一种缓冲函数,该函数在序列化之前或期间处理数据,具体取决于哪种方式更容易实现,如果选择前者,数据将首先经过验证(返回类型和参数类型相同),然后进行序列化,否则,数据将在转换时进行检查。。

相关内容

  • 没有找到相关文章

最新更新