【问题标题】:Serializing datatable throws strange exception序列化数据表会引发奇怪的异常
【发布时间】:2018-11-06 09:41:08
【问题描述】:

我想序列化一个包含其他几个数据表的Datatable。过去,我从来没有遇到过这段代码的问题:

System.IO.FileStream file = new System.IO.FileStream(fName, System.IO.FileMode.CreateNew);
System.IO.StreamWriter writer = new System.IO.StreamWriter(file);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

try{
    bf.Serialize(writer.BaseStream, dt);
}catch(System.Exception ex){throw new System.Exception("Error serializing data stack!" + System.Environment.NewLine + "Error details: " + ex.Message);}

writer.Close();
writer.Dispose();

file.Close();
file.Dispose();

但这一次,我收到了一个奇怪的文本异常(抱歉 - 只是用德语找到的):

序列化数据堆栈时出错! 错误详细信息:Das Ersatzzeichenpaar (0xDB8C, 0xAD3) ist ungültig。 Ein hohes Ersatzzeichen (0xD800 - 0xDBFF) muss stets mit einem niedrigen Ersatzzeichen (0xDC00 - 0xDFFF) ein Paar bilden。`

你可以这样翻译:

替换字符(0xDB8C,0xAD3)无效。高位替代字符必须与低位替代字符 (0xDC00 - 0xDFFF) 配对。`

我真的不知道使用二进制格式化程序意味着什么。

【问题讨论】:

  • 一个数据表不包含其他数据表。 数据集可以。数据集和数据表可以直接序列化为 XML。 BinaryFormatter 一般使用,也被认为存在安全风险。至于错误,请发布 actual 异常文本,而不仅仅是消息。 Exception.ToString() 返回的完整异常文本包含异常类型、任何内部异常和调用堆栈。翻译后的消息是不可搜索的,而异常类型和调用堆栈可以立即指向错误,或者用于谷歌搜索
  • 作为旁注。以这种方式处理异常是不正确的。您丢失堆栈跟踪只是为了将您自己的消息添加给可怜的最终用户,这肯定不明白您在那里写了什么。最好将错误记录在文件或数据库中,并提供友好的错误消息
  • 看起来 BinaryFormatter 无法处理 unpaired surrogates使用它的另一个原因
  • @Jan021981 你想做什么,为什么要使用 BinaryFormatter?为什么点头 XML?我怀疑压缩后的 XML 文件会比 BinaryFormatter 生成的任何文件都小,没有任何怪癖和安全风险
  • 一个数据表可以包含其他数据表:DataTable.Columns.Add(new System.Data.DataColumn("My subtalbes", typeof(DataTable)));我在这里使用基于.Net的软件BluePrism,这个程序只提供数据表。我不能使用其他容器。

标签: c# serialization binaryformatter


【解决方案1】:

数据表中的一条记录在文本字段中包含无效的 Unicode 字符。尝试通过一条一条过滤掉记录来隔离它。

在循环中,为数据表中的每条记录创建一个只有一条记录的新数据表。尝试序列化单记录 DT。看看它会在哪个记录上失败。然后检查记录,看看有什么问题。

【讨论】:

    猜你喜欢
    • 2012-05-08
    • 2013-02-07
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2011-05-20
    相关资源
    最近更新 更多