我试图通过使用SOAP格式化程序对它们进行序列化来将一些对象存储在SQL Server Compact(SQL CE)数据库中。序列化似乎工作正常,但当我尝试反序列化对象时,我得到一个错误说
有一个未封闭的文字字符串。第53行,第72位。
此外,在尝试填充数据集时重新启动应用程序后,我收到以下错误:
无法启用约束。一行或多行包含违反非null,唯一或外键约束的值。
我的所有列(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 Compact数据库中的字段类型为nvarchar
,限制为3500.
我尝试使用二进制格式化程序,但在序列化时似乎总是返回一个空的byte []缓冲区。我真的需要深度序列化,这就是为什么XML序列化器是不可能的。
答案 0 :(得分:1)
好的,所以这个我一直试图弄清楚两个多月了。 虽然我找不到问题的逻辑解决方案,但似乎将编码更改为utf7解决了问题。我想不出这个问题的原因,但它似乎特定于我的机器(我终于有机会在另一台计算机上运行代码,它与utf8完美配合)。