从SQL Server Compact反序列化会抛出“有一个未关闭的文字字符串”。错误

时间:2010-12-01 21:58:02

标签: c# sql serialization soap

我试图通过使用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序列化器是不可能的。

1 个答案:

答案 0 :(得分:1)

好的,所以这个我一直试图弄清楚两个多月了。 虽然我找不到问题的逻辑解决方案,但似乎将编码更改为utf7解决了问题。我想不出这个问题的原因,但它似乎特定于我的机器(我终于有机会在另一台计算机上运行代码,它与utf8完美配合)。