2012-06-04 146 views
1

我有一個具有bool屬性的簡單類。該屬性的'Get'邏輯執行存儲過程以從數據庫返回位字段。基於DB值的序列化和反序列化屬性

然後,我序列化這個類,並將它保存到數據庫中的XML字段。它保存類和布爾屬性就好,沒問題。

我似乎遇到的問題是當我反序列化這個類時。該類deserilizes就好了,但是當驅動bool字段的數據已更新時,似乎該類只識別XML中序列化的內容,並且它不回頭查看數據庫以獲取新的bool值(不執行我的程序獲取新的更新位字段)。

我的解決方案是將XmlIgnoreAttribute屬性添加到此字段,因此它不是以序列化開始的。但是我想知道是否有人注意到這一點和/或可以幫助我理解.NET XmlSerializer類的內部工作。

謝謝!

[XmlIgnoreAttribute] 
    public bool IsUpdated 
    { 
     get 
     { 
      DataTable dtResults = mclsSQLServerTool.LoadDataTable("exec stp_RL_SEL_NameIsUpdated '" + mstrName + "'"); 
      bool blnIsUpdated = Convert.ToBoolean(dtResults.Rows[0]["RU_bitIsUpdated"]); 

      return blnIsUpdated; 

     } 
    } 
+1

我有點困惑。我認爲(沒有檢查)XmlSerializer會忽略只讀簡單值(不是列表)。這是你的實際代碼嗎?你期望*發生了什麼? –

+0

我期望它執行proc並從數據庫中獲取最新值。 我相信你對XmlSerializer和只讀值是正確的。上面的代碼是我添加了XmlIgnoreAttribute的最新代碼;我曾經有一個簡單的設置塊{} –

+0

它爲什麼會這樣做?反序列化器並不都對getter(除了列表等)感興趣 - 即使它運行(它不應該),因爲它不會在任何地方存儲任何東西...... *你會怎麼知道?* –

回答

0

這裏要注意的第一件事是,[XmlIgnore]是多餘的; XmlSerializer只是不感興趣在只能得到的屬性(列表除外),因爲它知道它不能反序列化它們。例如:

public class SomeType 
{ 
    public string Foo { get; set; } 
    public string Bar { get { Console.WriteLine("get_Bar"); return "abc"; } } 

    static void Main() 
    { 
     var ser = new XmlSerializer(typeof (SomeType)); 
     ser.Serialize(Console.Out, new SomeType { Foo = "def" }); 
    } 
} 

輸出(減去別名等的命名空間):

<SomeType> 
    <Foo>def</Foo> 
</SomeType> 

(注意:Bar不叫)

反序列化,過程(簡單的值,而不是名單)很簡單:因爲在傳入的xml流中找到值,將它們解析爲成員並分配它們 - 即xml-deserializer基本上是基於傳入xml節點的榮耀的switch語句。

它會從來沒有隨機調用一個「集」,除非數據是在傳入xml(和屬性是讀/寫);當它確實,它預計分配值

在您的情況下有趣的是,您的「獲取」不分配任何值 - 沒有緩存。所以實際上,它不事情XmlSerializer不會觸及它 - 每次你訪問IsUpdated它會做查詢。就我個人而言,我懷疑這是一個錯誤,並可能導致積極和不可預知的數據查詢。

許多串行器支持序列化回調的概念,這將允許您在序列化結束時執行一些代碼;然而,XmlSerializer不是支持這一點。所以這不是一個選項。

你想達到什麼目的不是很清楚,但我只是在某個時候調用一個方法。

+0

謝謝馬克的答覆。我所追求的是更好地理解串行器在這種情況下的工作原理。我沒有用太多,特別是像這樣,所以我一直在尋找任何信息來解釋我看到的結果(谷歌搜索這個具體的問題很薄:)) 我認爲方法調用可能對這段代碼做一個很好的改變。 –

+0

@BrianG *行爲*很簡單:它可以將所有可以讀取和寫入的公共序列化;那麼它就會逆轉這一點。它不會序列化或反序列化您的財產,因爲它不是讀取和寫入。 –

+0

忽略空白設置塊(set {})編碼差和序列化這個屬性是沒有用的,有沒有一種方法可以想到在反序列化類後立即訪問IsUpdated屬性會返回序列化值而不是get方法中的代碼結果(SQL proc結果在我的情況下)?因爲是我看到的行爲。再次 謝謝! –

0

恕我直言,這是一個錯誤的使用屬性。屬性背後應該有很少或沒有代碼。如果此代碼曾用於客戶端 - 服務器應用程序中,則可能正在從客戶端進行數據庫調用。我會建議將此更改爲方法調用。如果要序列化結果,則將「Convert.ToBoolean」的結果存儲在屬性中。現在,它的屬性值是多少。

事情是這樣的......

public bool IsUpdated { get; private set; } 

public bool IsDataUpdated() 
{ 
    DataTable dtResults = mclsSQLServerTool.LoadDataTable("exec stp_RL_SEL_NameIsUpdated '" + mstrName + "'"); 
    IsUpdated = Convert.ToBoolean(dtResults.Rows[0]["RU_bitIsUpdated"]); 

    return IsUpdated; 
} 
+0

是的,我同意,方法調用將是這種類型的財產(或缺乏)更好的計劃 –

相關問題