13.4.3 XML 직렬화는 암시적으로 읽고 쓰는 작업
Noda Time에 포함된 대부분의 구조체는 IXmlSerializable을 구현한다. 불행히도 XML 직렬화를 지원하도록 하려면 읽기 전용 구조체로 변경하기가 어렵다. Noda Time 내의 직렬화 수행 과정은 다음 코드와 유사하다.
void IXmlSerializable.ReadXml(XmlReader reader)
{
var pattern = /* some suitable text parsing pattern for the type */;
var text = /* extract text from the XmlReader */;
this = pattern.Parse(text).Value;
}
문제를 찾았는가? 가장 마지막 줄에서 this에 값을 할당하는 코드가 문제가 된다. 슬프게도 이 코드 때문에 이 구조체에 readonly 한정자를 사용할 수가 없다. 이런 경우 세 가지 대안이 있을 수 있다.
• 구조체를 그대로 두는 방법이다. in 매개변수나 읽기 전용 참조 지역 변수를 사용하는 것만으로는 충분하지 않다.
• Noda Time의 다음 버전에서 XML 직렬화를 제거하는 방법이다.
• 안전하지 않은 코드를 사용하여 ReadXml 내에서 readonly 한정자의 제약을 뛰어넘는 방법이다. System.Runtime.CompilerServices.Unsafe 패키지를 이용하면 좀 더 쉽게 이런 작업을 수행할 수 있다.