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