【发布时间】: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