我有以下C#代码
using System.Runtime.Serialization;
using System.IO;
using System.Data;
// create a datatable with two columns [c1] and [c2]
var dt = new System.Data.DataTable("MyTable");
dt.Columns.Add(new DataColumn("c1", typeof(System.Int32)));
dt.Columns.Add(new DataColumn("c2", typeof(System.String)));
//create a new and populate it
var dr = dt.NewRow();
dr["c1"] = 1;
//dr["c2"]="hello"; //purposely commented out, if not, there is NO error
dt.Rows.Add(dr);
var s = new System.Runtime.Serialization.DataContractSerializer(typeof(object[]));
var mem = new MemoryStream();
// the following line will report error
s.WriteObject(mem, dt.Rows[0].ItemArray);
// other lines ... which have nothing to do with this question
如果我没有填充列[c2],则表示此数据行中存在DBNull值,然后在尝试运行 s.WriteObject()时会遇到错误。
错误:
键入' System.DBNull'与数据合同名称 '的DBNull:http://schemas.datacontract.org/2004/07/System'不是 预期。如果您正在使用,请考虑使用DataContractResolver DataContractSerializer或添加静态未知的任何类型 已知类型的列表 - 例如,通过使用KnownTypeAttribute 属性或将它们添加到传递给的已知类型列表中 串行器。
但根据MS文件" Types Supported by the Data Contract Serializer"
以特殊方式处理DBNull类型。它是单身人士, 在反序列化时,解串器尊重单例 约束并指向对单例实例的所有DBNull引用。 因为 DBNull是可序列化的类型,所以它需要 SerializationFormatter权限。
DBNull似乎是受支持的类型,我在这里真的很困惑。 任何大师可以分享一些灯吗?比如我该怎么办?
我知道我可以扫描所有表行并查找列值是否等于DBNull.Value,如果是这样,我为该列设置了一个空字符串或者其他东西,但这不是我想要的,因为这将是"篡改" DataTable值。
提前感谢您的帮助!
答案 0 :(得分:2)
将DBNull添加到knownTypes
列表
var s = new DataContractSerializer(typeof(object[]), new [] { typeof(DBNull) });