如何在DataContractSerializer中处理DBNull?

时间:2016-10-17 23:11:19

标签: c# .net serialization

我有以下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值。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

将DBNull添加到knownTypes列表

var s = new DataContractSerializer(typeof(object[]), new [] { typeof(DBNull) });