XmlSerialize一个可以为null的对象,DbNull,int,bool。字符串或双

时间:2011-12-09 07:30:17

标签: c# .net xmlserializer

我的班级有object字段,应该能够容纳nullDbNullint s,string s,{ {1}}或bool s。到目前为止,我已经能够double自动检测数据类型并正确序列化我的课程,除非XmlSerializerobject

我收到此错误:DbNull

这里最简单的解决方法是什么?

实际上没有太多代码可供展示。这可能是我的代码:

"The type System.DBNull was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically."

public class MyClass { public object MyMultiTypesObject { get; set; } } 将收到一个值,该值将是我上面提到的任何类型,因为它将是由MyMultiTypesObject处理时从原始javascript数据类型到C#数据类型的转换。 AFAIK,这些都是你将获得的类型。例如,WebBrowser转为numberdouble s,int转为undefinednull转为null }。

我按照通常使用DbNull序列化类的方式对其进行序列化,有点像这样:

XmlSerializer

2 个答案:

答案 0 :(得分:1)

尽管可以序列化System.DBNull类,但System.DBNull被设计为每个AppDomain只有一个实例。这些类型通常被称为单身人士。如果您有一个字段引用DBNull对象,则序列化和反序列化它不应该导致新的DBNull对象存在于AppDomain中。这就是默认序列化机制拒绝序列化的原因。

我认为你有两种方式:

  1. 在必须序列化字段
  2. 的情况下,不要使用DBNull值
  3. 在您的班级中实施 IXmlSerializable 并制作您自己的序列化机制
  4. 希望这篇精彩的文章可以帮到你:How to Implement IXmlSerializable Correctly

答案 1 :(得分:1)

可以xml序列化DBNull。见:

http://msdn.microsoft.com/en-us/library/ms731923(v=vs.110).aspx

将您的班级标记为:

[Serializable]
[System.Xml.Serialization.XmlRoot("PropertyEntry", Namespace = "", IsNullable = false)]
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public class PropertyEntry {}