성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
버전 업
사용 사례
개발자 대상
일반인 대상
기타
부모글 보이기/감추기
내용
아래의 내용은 SmallTool ver 1,0,0,8부터 방식이 변경되었습니다.<br /> 다음의 URL을 참조하십시오.<br /> <a target="_blank" href="/Default.aspx?mode=2&sub=3&pageno=0&detail=1&wid=31">/Default.aspx?mode=2&sub=3&pageno=0&detail=1&wid=31</a><br /> <br /> <hr /> 지난번 토픽에 이어서 진행하도록 하겠습니다.<br /> <br /> TFSAddItemT를 정의했었는데요.<br /> 그 ComplexType에 Enum 형을 갖는 속성을 하나 추가해 보도록 하겠습니다.<br /> <br /> 그렇다면 우선 Enum Type부터 정의를 해야할 텐데요.<br /> 보통 XSDObjectGen.exe를 위해 다음과 같이 Single Type으로 정의를 합니다.<br /> <br /> <pre class="code"> <xs:simpleType name="ProtocolEnum"> <xs:restriction base="xs:string"> <xs:enumeration value="HTTP" /> <xs:enumeration value="HTTPS" /> </xs:restriction> </xs:simpleType> </pre> <br /> 위와 같이 정의된 것을 VS.NET 2005에서 제공하는 XSD Designer로 보면, 다음 화면과 같습니다.<br /> <br /> <img alt="Enum 정의" src="/SysWebRes/bbs/xsd_st_enum_def.png" /><br /> <br /> 물론, 이렇게 했을 때 문제점이 있습니다.<br /> Enum 값의 Serialize 결과가 문자열로 되어버린다는 것이죠. 더군다나 Database 같은 경우, 값을 저장할 때 보통 숫자값으로 저장을 한다는 점과, 그 숫자값이 연속적인 값이 아닐 수도 있다는 예외 상황이 있습니다.<br /> <br /> 예를 들어, 우리가 흔히 C++에서 정의했던 enum은 다음과 같은 경우도 많은데요.<br /> <br /> <pre class="code"> typedef enum tagProtocolEnum { HTTP = 80, HTTPS = 443 } ProtocolEnum; </pre> <br /> 위와 같은 구조로 Enum 형을 처리하는 것을 현재의 XSDObjectGen.exe는 지원하지 않고 있습니다.<br /> <br /> <hr /> <br /> 그렇다고 손놓고, XSDObjectGen.exe가 업데이트될 때까지 기다리기도 지루하죠. ^^<br /> <br /> 자... 어쩔 수 없습니다. 소스를 수정하는 수밖에.<br /> 참고로, 여러분 스스로 소스를 확장할 수 있도록 다음의 토픽에 소스를 올려두었습니다.<br /> XSDObjectGen 1.4.2.1 - 커스터마이징<br /> ; <a target="_blank" href="/Default.aspx?mode=2&sub=3&pageno=0&detail=1&wid=23">/Default.aspx?mode=2&sub=3&pageno=0&detail=1&wid=23</a><br /> <br /> 일단, XSDObjectGen.exe의 소스를 수정하는 것은 어떻게든 해보겠지만.<br /> 문제는 XSD Schema 정의에서 "표준"을 벗어나서는 안된다는 제약이 있습니다. 다행히도 Enum을 처리하는 데에는 표준을 벗어나지는 않을 수 있었는데요. 바로 다음과 같이 xs:enumeration의 "id" 속성을 활용하는 것입니다.<br /> <br /> 그래서, 아래와 같이 변경할 수 있었습니다.<br /> <br /> <pre class="code"> <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> </pre> <br /> 소스 수정은, ... 이미 된 것을 SmallTool에 반영시켜 놓았으니, SmallTool 1.0.0.4 버전 이상을 클라이언트에 설치하시면 됩니다. <br /> <br /> 이전에 설명해 드린 것처럼, "STXSDObjectGen" custom tool을 속성창에 정의해 놓았다면, 위와 같이 XSD를 변경하고 "저장"을 하는 순간, DataTypes.cs 파일이 자동으로 바뀌게 됩니다.<br /> <br /> 바뀐 소스를 한번 살펴 볼까요? ^^<br /> <br /> <pre class="code"> [Serializable] public enum ProtocolEnum { [XmlEnum(Name="80")] HTTP = 80, [XmlEnum(Name="8080")] HTTPS = 8080, } </pre> <br /> 우와... 우리가 원한 대로 나온 것 같습니다.<br /> 위와 같이 정의된 것을 VS.NET 2005에서 제공하는 XSD Designer로 보면, 다음 화면과 같습니다.<br /> <br /> <img alt="Enum 정의" src="/SysWebRes/bbs/xsd_st_enum_def2.png" /><br /> <br /> 이제 위의 화면에서 정의된 TFSAddItemT 클래스를 인스턴스화하고, XML Serialization을 해보면,<br /> <br /> <pre class="code"> ------ cs 코드 ------- WinFormApp.Data.TFSAddItemT item = new WinFormApp.Data.TFSAddItemT(); item.Port = 8070; item.Name = "Win2003"; item.Protocol = WinFormApp.Data.ProtocolEnum.HTTP; StringWriter sw = new StringWriter(); XmlSerializer xs = new XmlSerializer(typeof(WinFormApp.Data.TFSAddItemT)); xs.Serialize(sw, item); string txt = sw.ToString(); MessageBox.Show(txt); </pre> <br /> MessageBox 결과, 다음과 같은 문자열로 직렬화된 것을 확인할 수 있습니다.<br /> <pre class="code"> <?xml version="1.0" encoding="utf-16"?> <TFSAddItemT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Win2003" Port="8070" Protocol="80" /> </pre> <br /> Enum 문제는 이걸로 해결되었습니다. ^^<br /> <br /> <hr /> 첨부된 파일은 위에서 사용된 예제 솔루션 파일입니다.<br /> 간단한 XSD 파일을 포함하고 있습니다. 물론, 정상적인 XSD 소스 생성을 테스트해 보기 위해서는 SmallTool을 설치하셔야 합니다.
첨부파일
스팸 방지용 인증 번호
1697
(왼쪽의 숫자를 입력해야 합니다.)