XMLSerialiser를 사용하여 DBNULL이 싱글 톤이 아닌 이유는 무엇입니까?
-
09-09-2019 - |
문제
나는 항상 dbnull.value가 싱글 톤이라고 가정했습니다. 따라서 다음과 같은 일을 할 수 있습니다.
vb.net :
If someObject Is DbNull.Value Then
...
End if
씨#:
If (someObject == DbNull.Value)
{
...
}
그러나 최근에 XMLSerialiser를 사용하여 DBNULL 인스턴스를 연속화했으며 갑자기 더 이상 싱글 톤이 아니 었습니다. 유형 비교 작업 (예 : C#의 (OBJ IS DBNULL))는 작동합니다.
코드는 다음과 같습니다.
[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;
}
왜 이런 경우입니까? 그리고 어떻게됩니까? 그리고 다른 정적 필드에서 일어날 수 있습니까?
추신 : VB 코드 샘플이 참조 비교를 수행하고 있으며 C#은 Object.equals를 호출하고 있습니다. 둘 다 dbnull과 동일한 동작을 가지고 있습니다. 나는 보통 VB와 함께 일합니다.
해결책
하지만 DBNull.Value
a static readonly
그리고 단일 인스턴스로만 존재합니다 ... SERIALIZE를 해제 할 때 직렬화 코드는 클래스의 새로운 인스턴스를 생성합니다. DBNull
스트림의 '데이터'에서. 이후 DBNull.Value
단순히 a입니다 DBNull
예를 들어, 직렬화가 '특별한'인스턴스임을 알 수있는 방법은 없습니다.
노트:
같은 이유로, 당신이 당신이 일련의 '싱글 톤'인스턴스를 사용하여 자신의 수업을 일련의 수업으로 만들면, 당신은 정확히 동일한 동작을 얻게됩니다. 사형화 된 인스턴스는 원래 인스턴스와 구별 할 수 없지만 동일한 인스턴스.
다른 팁
C# 코드는 .equals 메소드를 호출하지 않습니다. 테스트를 거치면 실제로 당신이 대체했는지 확실히 확신합니다.
someObject == DbNull.Value
~와 함께
DbNull.Value.Equals(someObject)
그것은 당신에게 예상 결과를 줄 것입니다. 평등 연산자의 일부 내부 및 Equals Method의 경우 다음을 살펴 봅니다.그 주제에 대한 Eric Lipperts 블로그 게시물