2011-06-02 99 views
2

實現我表示一些空氣隧道的物理特性的對象:類數據驗證

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

我需要檢查的參數的正確性:例如,長度必須> 0,壓力>= 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文件反序列化到/。所以問題是它不能用於序列化(如果我沒有弄錯)。用戶可以編輯文件並輸入他想要的任何內容,但我無法捕捉它。

所以,據我所知,需要創建一些函數(在Tunnel類或另一個),我會打電話來檢查所有值是否正確。但是這裏有另一個問題:Tunnel可能有幾個無效的參數。我應該如何返回錯誤並處理它們?程序必須在一次調用中返回所有發現的錯誤。而這種方式對於我自己的班級使用是有好處的。我可能不能讓其他程序員在每次數據編輯之後使用驗證。

給我請一個諮詢如何會更正確的實現值的此類檢查和解決我的問題 - 也許另一些靈活的方式,這樣會很容易地管理和提高在未來這段代碼。謝謝。

編輯:回到我的第一個想法,是否有任何方法來驗證序列化期間或之後的數據?

+0

我不知道如何實際系列化的作品。但是,當xml被轉換爲對象時,你不想做檢查,所以當輸入不正確時序列化失敗了嗎? – 2011-06-02 19:43:17

+0

你是如何反序列化它的?你是否在Tunnel類上調用靜態Deserialize方法? – 2011-06-02 19:53:22

+0

我將它寫的東西就像這個[教程](http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization)。其實,我是新來的這個問題,但已閱讀,這個過程只是恢復所有的私有成員,而無需調用屬性訪問器。 – 2011-06-02 20:01:06

回答

4

最簡單的方式:

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

一個好方法,但僅限於我自己使用。在任何對類成員進行編輯或反序列化之後,我如何要求另一位程序員調用此方法? – 2011-06-02 20:37:36

+1

對我以前的問題,可能我只需要編寫一個函數來執行這兩個操作:反序列化和驗證。所以結果總是正確的。 – 2011-06-02 21:01:39

1

我想到的是這個。

我會保持一個只讀的IsValid屬性。在吸氣劑我會做我所有的驗證,並說真或假。

在我使用該對象的任何地方,我會檢查object.IsValid是否爲true。

1

請嘗試將文件通過包裝函數每次,並使磁盤上的文件的只讀爲普通用戶,也就是說,如果用戶編輯該文件,他這樣做只能通過你的程序,當用戶完成編輯時,通過你的函數傳遞所有數據,看看整個數據是否仍然有效,

+0

禁止使用開放格式進行文件編輯並編寫其他程序不是一個好主意......編寫包裝函數是一種方法。 – 2011-06-02 21:00:02

1

對於編輯:使序列化流通過sort-緩衝函數,它在序列化之前或期間處理數據,取決於哪種方式更容易實現,如果選擇了前者,數據會先被驗證(返回類型和參數類型將是相同的),然後進行序列化,否則,它被轉換的數據將被檢查..