Wcf 使用DataContractSerializer序列化数据集时保留DataRowState

Wcf 使用DataContractSerializer序列化数据集时保留DataRowState,wcf,serialization,dataset,rowstate,Wcf,Serialization,Dataset,Rowstate,出于各种原因,我不得不将类型化数据集发送到WCF服务端点。这很好,只是在反序列化时,每个数据表中每一行的RowState都设置为“Added”,而不管它们在客户端上是什么。如果我将序列化流写入文件,我会看到RowState不是序列化数据的一部分。我如何添加它,以便跨服务边界保留行状态?我认为这并不重要,但客户端进程正在运行.net 3.5,而服务进程正在运行.net 4.0 public DataRowState RowState { get { if (this

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

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;
    }
}
公共数据行状态行状态
{
得到
{
if(this.oldRecord==this.newRecord)
{
if(this.oldRecord==-1)
{
返回DataRowState.Detached;
}
if(0
正如您所看到的,对于它的值,您可能无能为力,因为它是经过计算的,而不仅仅是存储的。最简单的解决方案可能是向包含行状态的数据集添加另一列



(为什么它总是计算出附加值?很可能是因为当序列化数据集在服务器上重新水化时,会创建新行并将其添加到数据集-因此该值实际上是正确的。如果您按照上述建议向数据集添加另一列,则需要更改服务器代码以使其成为正确的值。)是否能够检查和处理它?如果您打算进行这种更改,那么也许值得做整个事情并重新编码该服务以使用适当的可序列化DTO?。

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

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

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

感谢heaps,这是一个很好的答案。是的,很难说这是一个错误,因为从数据集的角度来看,行是在重新水化时添加的。我怀疑DTO可能是一种方法。