SQL Server Compact(SQL CE)データベースにいくつかのオブジェクトをSOAPフォーマッタでシリアル化して保存しようとしています。シリアライズはうまく動作するようだが、私は、オブジェクトを逆シリアル化しようとしたとき、私はSQL Server Compactから逆シリアル化すると、 "閉じられていないリテラル文字列があります。"エラー
There is an unclosed literal string. Line 53, position 72.
を言ってエラーが出るさらに、データセットを埋めるためにしようとする上でアプリケーションを再起動した後、私は次のエラーを取得する:
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
私のすべての列(IDを除く)はヌル値を許しており、一意ではないため、どこから来るのか分かりません。ここに私のシリアライザのコードは次のとおりです。ここで
public static class Serializer
{
static public string Serialize(AssessmentReport theObject)
{
MemoryStream mStream = new MemoryStream();
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(mStream, theObject);
byte[] buffer = mStream.ToArray();
mStream.Close();
string value = Encoding.UTF8.GetString(buffer);
return value;
}
static public AssessmentReport Deserialize(string value)
{
byte[] buffer = Encoding.UTF8.GetBytes(value);
MemoryStream mStream = new MemoryStream(buffer);
SoapFormatter formatter = new SoapFormatter();
mStream.Position = 0;
AssessmentReport theReport = (AssessmentReport)formatter.Deserialize(mStream);
mStream.Close();
return theReport;
}
}
は、私は(theReport
をシリアル化するオブジェクトのインスタンスである)シリアライザを呼び出す方法です:
examTableAdapter.UpdateAsmFile(Serializer.Serialize(theReport), examID);
そして、ここでは、私が呼び出しています方法ですデシリアライズ方法:
string value = Convert.ToString(examTableAdapter.GetAsmFile(2));
AsmReport theReport = Serializer.Deserialize(value)
文字列が保存されているSQL Serverのコンパクトなデータベースのフィールドが3500の限界とタイプ
nvarchar
である
私はバイナリフォーマッタを使ってみましたが、シリアル化すると常に空のbyte []バッファが返されるようです。私は本当に深いシリアライズが必要です。そのため、XMLシリアライザは問題になりません。
シリアライズされた文字列が3500文字の上限を超えていないことを確認しましたか? SOAP表現はかなり大きくなる可能性があります。 –
ストリームで.Flush()を呼び出してからバイト配列に変換します。それはおそらく可能性があります。 –
Deserializeメソッドに渡す "value"パラメータをチェックしていますか?それはどのように見えるのですか? –