2

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

4

2 回答 2

2

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

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

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

于 2011-07-11T20:22:04.940 回答
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?)。

于 2010-05-25T00:54:53.947 回答