2

さまざまな理由で、型指定されたデータセットをWCFサービスエンドポイントに送信する必要があります。これは、逆シリアル化時に、クライアントに何があったかに関係なく、各DataTableの各行のRowStateが「追加」に設定されることを除いて正常に機能します。シリアル化されたストリームをファイルに書き出すと、RowStateがシリアル化されたデータの一部ではないことがわかります。これを追加して、サービスの境界を越えてRowStateを保持できるようにするにはどうすればよいですか?重要だとは思いませんが、サービスプロセスが.net 4.0を実行している間、クライアントプロセスは.net3.5を実行しています。

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 に答える