如何处理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的值。
提前感谢您的帮助!
添加DBNull到knownTypes
列表
var s = new DataContractSerializer(typeof(object[]), new [] { typeof(DBNull) });