2010-05-25 46 views
2

由於各種原因,我不得不將類型化數據集發送到WCF服務端點。這很好地工作,除了反序列化之外,每個DataTable中每行的RowState都設置爲'Added',而不管它們在客戶端上是什麼。如果我將序列化流寫入文件,我會發現RowState不是序列化數據的一部分。如何添加這個以便我可以跨越服務邊界保留RowState?不,我認爲它很重要,但在服務進程.NET運行4.0使用DataContractSerializer序列化DataSet時保留DataRowState

回答

1

客戶端進程.NET運行3.5下面是RowState屬性的代碼:

public DataRowState RowState 
{ 
    get 
    { 
     if (this.oldRecord == this.newRecord) 
     { 
      if (this.oldRecord == -1) 
      { 
       return DataRowState.Detached; 
      } 
      if (0 < this._columns.ColumnsImplementingIChangeTrackingCount) 
      { 
       foreach (DataColumn column in this._columns.ColumnsImplementingIChangeTracking) 
       { 
        object obj2 = this[column]; 
        if ((DBNull.Value != obj2) && ((IChangeTracking)obj2).IsChanged) 
        { 
         return DataRowState.Modified; 
        } 
       } 
      } 
      return DataRowState.Unchanged; 
     } 
     if (this.oldRecord == -1) 
     { 
      return DataRowState.Added; 
     } 
     if (this.newRecord == -1) 
     { 
      return DataRowState.Deleted; 
     } 
     return DataRowState.Modified; 
    } 
} 

,你可以看到,對於它的價值可能沒有什麼可以做的,因爲它是被計算而不是被存儲的。最簡單的解決方案可能是將另一列添加到包含行狀態的DataSet中。


(爲什麼總是算出來的值新增最有可能的,因爲當你的序列化數據集水化回服務器上,創建並添加到數據集中的新行 - ?所以價值是相當如果你按照上面的建議添加另一列到數據集,那將需要修改服務器代碼以便能夠檢查和處理它 - 如果你要做出這樣的改變,那麼它可能是值得的做整件事,並重新編碼該服務,以使用適當的可序列化DTOs?)。

+0

感謝堆 - 偉大的答案。是的 - 很難說這是一個錯誤,因爲從DataSets的角度來看,這些行是在補液時添加的。 我懷疑DTO可能是要走的路。 – Chruzi 2010-05-25 01:32:10

3

我有這個問題也和發現這是一個非常簡單的解決方案: 而不是使用DataSet對象的「中WriteXML法」,「手動」序列化對象使用BinaryFormatter

BinaryFormatter bf = new BinaryFormatter(); 
using(FileStream fs = File.Open("datastore.dat", FileMode.Create, FileAccess.Write)) 
{ 
    bf.Serialize(fs, ds); 
} 

當你反序列化時,對象與之前的狀態完全相同,包括行狀態數據。

相關問題