如何处理DataContractSerializer中的DBNull

本文关键字:DataContractSerializer 中的 DBNull 处理 何处理 | 更新日期: 2023-09-27 18:13:39

我有以下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()时遇到错误。

错误:

类型的系统。DBNull',包含数据契约名称'DBNull:http://schemas.datacontract.org/2004/07/System'不是预期。考虑使用DataContractResolver,如果您正在使用类中添加任何未知的静态类型已知类型的列表—例如,通过使用KnownTypeAttribute属性的已知类型列表中添加它们序列化器。

但是根据MS文档" Data Contract Serializer支持的类型"

DBNull类型以一种特殊的方式处理。它是单例类型,在反序列化时,反序列化器尊重单例约束,并将所有DBNull引用指向单例实例。因为DBNull是一个可序列化的类型,所以它需要SerializationFormatter许可。

DBNull似乎是一个受支持的类型,我在这里真的很困惑。哪位大师能给我几盏灯吗?比如我应该做什么?

我知道我可以扫描所有表行并查找列值是否等于DBNull。值,如果是,我为这个列设置一个空字符串或其他东西,但这不是我想要的,因为这会"篡改"DataTable的值。

提前感谢您的帮助!

如何处理DataContractSerializer中的DBNull

添加DBNull到knownTypes列表

var s = new DataContractSerializer(typeof(object[]), new [] { typeof(DBNull) });
相关文章:
  • 没有找到相关文章