partial 클래스 추가
.NET 2.0으로 오면서 "partial" 예약어가 추가되었습니다. 어떤 용도로 사용되는지는 다 아실 테니, 더 이상 구구절절이 설명하지 않겠습니다.
partial 클래스의 위력이 나오는 것이, 바로 "자동 생성된 코드"에 개발자가 특별한 목적으로 부가 코드를 넣어야 할 때입니다. XSDObjectGen.exe로 XSD 파일을 cs 파일로 변환하는 경우가 그렇다고 볼 수 있겠지요. ^^
때로는, 자동 생성된 클래스에 원하는 함수를 집어넣고 싶은 경우가 있습니다.
예를 들어, 해당 클래스를 위한 Serialize 함수가 그것인데요. 그 커스텀 코드를 자동 생성 파일에 직접 써 넣었다가는 ^^ 나중에 또다시 생성되는 시점에 모든 커스텀 코드가 날아가 버리기 때문에 그렇게 해서는 안되는데요.
그런 코드를 집어 넣기 위해 ^^ SmallTool 1.0.0.6부터 제공되는 XSDObjectGen에는 모든 클래스를 "partial"로 정의를 해주게 되어 있습니다.
지난번의 XSD 예제를 한번 볼까요!
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="DataTypes" targetNamespace="http://tempuri.org/DataTypes.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/DataTypes.xsd" xmlns:mstns="http://tempuri.org/DataTypes.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="TFSAddItemT">
<xs:attribute name="Name" type="xs:string" />
<xs:attribute name="Port" type="xs:int" />
<xs:attribute name="Protocol" type="ProtocolEnum" />
</xs:complexType>
<xs:simpleType name="ProtocolEnum">
<xs:restriction base="xs:short">
<xs:enumeration id="HTTP" value="80" />
<xs:enumeration id="HTTPS" value="8080" />
</xs:restriction>
</xs:simpleType>
<xs:element name="CollectionDef">
<xs:complexType>
<xs:sequence>
<xs:element name="TFSAddItemList" type="TFSAddItemT" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
지난번 예제와 비교해서, Collection 클래스가 생성되도록 하는 부분만 추가되었을 뿐입니다. 위의 XSD 파일을 SmallTool 1.0.0.6에서 제공되는 XSDObjectGen에 통과시키면 다음과 같은 코드 구조가 생성됩니다.
public partial class Declarations
{
public const string SchemaVersion = "http://tempuri.org/DataTypes.xsd";
}
[Serializable]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public partial class TFSAddItemTCollection : ArrayList
{
// 중간 생략
}
[XmlType(TypeName="TFSAddItemT",Namespace=Declarations.SchemaVersion),Serializable]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public partial class TFSAddItemT
{
// 중간 생략
}
[XmlRootElementName="CollectionDef",Namespace=Declarations.SchemaVersion,IsNullable=false),Serializable]
public partial class CollectionDef
{
// 중간 생략
}
이제, 여러분이 원하는 기능을 추가하고 싶다면, 새로운 CS 파일을 하나 더 생성하고, 동일한 partial class를 만들어 주시면 됩니다. 물론, 새로운 partial class에는 원하는 인터페이스 상속을 하도록 만들 수도 있을 것입니다. 가령, ISerialzable 인터페이스 같은 것들이 되겠지요. ^^
첨부된 예제 솔루션은, 위의 partial class 확장을 통해서 Binary Serialize를 구현하는 예를 보여주고 있습니다.
코드가 그리 크지 않고 어렵지 않으니, 쉽게 보실 수 있을 것 같아서 설명은 생략합니다.
그냥 컴파일 한 번 하고, F5 디버깅으로 한줄 한줄 따라가시면 금새 이해하실 수 있을 것입니다. ^^