使用DataContractSerializer序列化DataSet时保留DataRowState

时间:2010-05-25 00:01:34

标签: wcf serialization dataset rowstate

由于各种原因,我不得不将类型化数据集发送到WCF服务端点。除了在反序列化时,每个DataTable中每行的RowState设置为“Added”,无论它们在客户端上是什么,这都可以正常工作。如果我将序列化流写入文件,我看到RowState不是序列化数据的一部分。如何添加它以便我可以跨服务边界保留RowState?并不是说我认为这很重要,但是当服务进程运行时,客户端进程正在运行.net 3.5 .net 4.0

2 个答案:

答案 0 :(得分:2)

我也有这个问题,并找到了一个非常简单的解决方案: 而不是使用数据集对象的“WriteXml”方法,使用BinaryFormatter“手动”序列化对象:

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

反序列化时,对象处于与以前完全相同的状态,包括rowstate数据。

答案 1 :(得分:1)

以下是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中。


(为什么总是计算出值已添加?最有可能的原因是当您的序列化数据集在服务器上重新水化时,会创建新行并将其添加到数据集中 - 因此值为如果按照上面的建议将另一列添加到数据集中,则需要更改服务器代码以便能够检查和处理它 - 如果您要进行那种更改,那么可能是值得做的事情并重新编写该服务以使用适当的可序列化DTO代替?)。