C# 从SQL Server Compact反序列化会抛出一个;有一个未关闭的文字字符串。”;错误
我正试图通过使用SOAP格式化程序序列化(SQLCE)数据库中的一些对象。序列化似乎工作得很好,但是当我尝试反序列化对象时,我得到一个错误 存在一个未关闭的文本字符串。第53行,位置72 此外,在尝试填充数据集时重新启动应用程序后,出现以下错误: 未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值 我的所有列(ID除外)都允许空值,并且是非唯一的,所以我不知道这是从哪里来的。以下是我的序列化程序的代码:C# 从SQL Server Compact反序列化会抛出一个;有一个未关闭的文字字符串。”;错误,c#,sql,serialization,soap,C#,Sql,Serialization,Soap,我正试图通过使用SOAP格式化程序序列化(SQLCE)数据库中的一些对象。序列化似乎工作得很好,但是当我尝试反序列化对象时,我得到一个错误 存在一个未关闭的文本字符串。第53行,位置72 此外,在尝试填充数据集时重新启动应用程序后,出现以下错误: 未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值 我的所有列(ID除外)都允许空值,并且是非唯一的,所以我不知道这是从哪里来的。以下是我的序列化程序的代码: public static class Serializer { stati
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
是要序列化的对象的实例):
下面是我调用反序列化方法的方式:
string value = Convert.ToString(examTableAdapter.GetAsmFile(2));
AsmReport theReport = Serializer.Deserialize(value)
SQL Server Compact数据库中保存字符串的字段类型为nvarchar
,限制为3500
我尝试使用二进制格式化程序,但序列化时似乎总是返回一个空字节[]缓冲区。我真的需要深度序列化,这就是为什么XML序列化程序不成问题的原因。好的,这是我两个多月来一直在尝试解决的问题。
虽然我找不到这个问题的逻辑解决方案,但似乎将编码更改为utf7解决了这个问题。我想不出为什么会出现这样的问题,但这似乎是我的机器特有的(我终于有机会在另一台计算机上运行代码,它与utf8完美配合)。您是否验证了序列化字符串没有超出3500个字符的限制?在将流转换为字节数组之前,SOAP表示可以在流上获得相当大的.Call.Flush()。这可能是错误的。您是否正在检查传递给反序列化方法的“value”参数?它看起来像什么?值看起来很好,我的意思是文档没有突然被切断或损坏。
string value = Convert.ToString(examTableAdapter.GetAsmFile(2));
AsmReport theReport = Serializer.Deserialize(value)