XMLシリアライズできないケースに対応する。DBNull.Valueに対応する。

アトリビュートを付けているクラスであればシリアライズすることができます。ですが、インスタンスによっては失敗するケースがあります。

■Object変数にDBNull.Valueを含む場合


System.InvalidOperationException が発生しました。
Message="XML ドキュメントを生成中にエラーが発生しました。"
Message="型 System.DBNull は指定されていません。スタティックに使用できない型を指定するには XmlInclude または SoapInclude 属性を使ってください。"

これは、System.DBNullがXMLシリアライズに対応していないために発生する問題で、XMLInclude属性を付けてSystem.DBNullが含まれる事を通知する必要があります。


_


Imports System.Xml
Imports System.Xml.Serialization
Imports System.IO

Public Class Form1

_
_
Public Class Item
Public Name As String = String.Empty
Public Value As Object = Nothing
End Class

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim item As New Item

item.Name = "Taro"
item.Value = DBNull.Value

If Convert.IsDBNull(item.Value) = True Then
item.Value = Nothing
End If

Dim serializer As New XmlSerializer(GetType(Item))

Dim sw As New StreamWriter("c:\xml.txt")

serializer.Serialize(sw, item)

sw.Close()

Dim dt As New DataTable

dt.Columns.Add("ID", GetType(String))
dt.Columns.Add("NAME", GetType(String))

Dim dr As DataRow = dt.NewRow

dr.Item("ID") = 1
dr.Item("NAME") = DBNull.Value

dt.Rows.Add(dr)

dt.TableName = "MASTER"

serializer = New XmlSerializer(GetType(DataTable))

sw = New StreamWriter("c:\xml.txt")

serializer.Serialize(sw, dt)

sw.Close()

End Sub
End Class