Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从SQL Server Compact反序列化会抛出一个;有一个未关闭的文字字符串。”;错误_C#_Sql_Serialization_Soap - Fatal编程技术网

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

C# 从SQL Server Compact反序列化会抛出一个;有一个未关闭的文字字符串。”;错误,c#,sql,serialization,soap,C#,Sql,Serialization,Soap,我正试图通过使用SOAP格式化程序序列化(SQLCE)数据库中的一些对象。序列化似乎工作得很好,但是当我尝试反序列化对象时,我得到一个错误 存在一个未关闭的文本字符串。第53行,位置72 此外,在尝试填充数据集时重新启动应用程序后,出现以下错误: 未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值 我的所有列(ID除外)都允许空值,并且是非唯一的,所以我不知道这是从哪里来的。以下是我的序列化程序的代码: public static class Serializer { stati

我正试图通过使用SOAP格式化程序序列化(SQLCE)数据库中的一些对象。序列化似乎工作得很好,但是当我尝试反序列化对象时,我得到一个错误

存在一个未关闭的文本字符串。第53行,位置72

此外,在尝试填充数据集时重新启动应用程序后,出现以下错误:

未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值

我的所有列(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
是要序列化的对象的实例):

下面是我调用反序列化方法的方式:

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)