¿Por qué mi DbNull no es un singleton cuando lo deserializo usando XmlSerialiser?

Siempre he asumido que DbNull.value era un singleton. Y así podrías hacer cosas como esta:

VB.NET:

If someObject Is DbNull.Value Then
    ...
End if

C#

If (someObject == DbNull.Value)
{
    ...
}

Pero recientemente, serialicé una instancia de DbNull usando el XmlSerialiser y de repente ya no era un singleton. Sin embargo, las operaciones de comparación de tipos (como C # 's (obj es DBNull)) funcionan bien.

Code sigue:

[Serializable, System.Xml.Serialization.XmlInclude(typeof(DBNull))]
public class SerialiseMe
{
    public SerialiseMe() { }

    public SerialiseMe(object value)
    {
        this.ICanBeDbNull = value;
    }
    public Object ICanBeDbNull { get; set; }
}

public void Foo()
{
    var serialiseDbNull = new SerialiseMe(DBNull.Value);
    var serialiser = new System.Xml.Serialization.XmlSerializer(typeof(SerialiseMe));
    var ms = new System.IO.MemoryStream();
    serialiser.Serialize(ms, serialiseDbNull);
    ms.Seek(0, System.IO.SeekOrigin.Begin);
    var deSerialisedDbNull = (SerialiseMe)serialiser.Deserialize(ms);

    // Is false, WTF!
    var equalsDbNullDeserialised = deSerialisedDbNull.ICanBeDbNull == DBNull.Value;
    // Is false, WTF!
    var refEqualsDbNullDeserialised = object.ReferenceEquals(deSerialisedDbNull.ICanBeDbNull, DBNull.Value);
    // Is true.
    var convertIsDbNullDeserialised = Convert.IsDBNull(deSerialisedDbNull.ICanBeDbNull);
    // Is true.
    var isIsDbNullDeserialised = deSerialisedDbNull.ICanBeDbNull is DBNull;

}

¿Por qué es este el caso? Y como sucede? ¿Y puede suceder con otros campos estáticos?

PS: Soy consciente de que el ejemplo de código VB está haciendo una comparación de referencia y c # está llamando a Object.Equals. Ambos tienen el mismo comportamiento con DBNull. Normalmente trabajo con VB.

Respuestas a la pregunta(4)

Su respuesta a la pregunta