Microsoft MVP성태의 닷넷 이야기
.NET : 67. System.Drawing.Color 구조체 직렬화 방법 [링크 복사], [링크+제목 복사],
조회: 10861
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 


System.Drawing.Color 구조체 직렬화 방법


얼마 전, Color 구조체를 포함한 특정 클래스의 값들이 당연히 직렬화 될 거라고 믿고 진행하는 도중 뜻하지 않게 만났던 문제였습니다. 해당 직렬화를 담당했던 래퍼 메서드가 제가 만든 것이어서, 처음에는 래퍼 메서드에 오류가 있다는 식으로 보고가 들어온 것입니다.

그럴 수밖에 없었던 것이, 아래의 정의를 보시면 아시겠지만 Color는 표면상으로 볼때, 직렬화에 전혀 문제가 없어보이기 때문입니다.

[SerializableAttribute]
[TypeConverterAttribute(typeof(ColorConverter))]
public struct Color

검색을 해보니, 일단은 직렬화가 안되는 것이 당연했습니다.

Topic:  XmlSerializer does not serialize Color
; http://www.forum.miraplacid.com/topic.pl?topic_id=183

Color의 RGB 정의가 각각 다음과 같이 read-only 속성이었기 때문입니다.

public byte R { get; }
public byte G { get; }
public byte B { get; }

오호... 왜? 읽기 전용 속성으로 된 것일까요? 잠시 고민해 보았지만, 그렇게 만든 의도에 대해서는 전혀 이해가 되질 않았습니다. 뭐, 아무렴 어떻습니까! 지금 중요한 것은 해당 속성들이 Read-only라는 것이니. 그렇다면, Color 속성에 대해서는 별도 속성 또는 문자열 등의 방법을 통해서 직렬화해야 해야 할 것 같습니다.

혹시나 싶어서, 이를 위한 좀 더 매끄러운 해결책이 없을까 싶어 좀 더 검색을 해보았는데, 그나마 가장 적절한 해법을 제시해 주는 다음의 토픽을 발견할 수 있었습니다.

System.Drawing.Color serialization 
; http://devintelligence.com/blogs/netadventures/archive/2005/11/28/1124.aspx

간단하니, 아래에 코드를 실어봅니다.

using System;
using System.Drawing;
using System.Xml.Serialization;

[Serializable]
public class Person
{
  private Color _HairColor = Color.Empty;
    
  public Person()
  {
  }
    
  [XmlIgnoreAttribute()]
  public Color HairColor
  {
    get
    {
      return _HairColor;
    }
    set
    {
      _HairColor = value;
    }
  }
    
  [XmlElement("HairColor")]
  public string HairColorHtml
  {
    get { return ColorTranslator.ToHtml(_HairColor); }
    set { _HairColor = ColorTranslator.FromHtml( value ); }
  }    
}

썩 마음에 들진 않지만, 그런대로 해결이 될 것 같습니다. 그런데, 다시 한번 궁금해집니다. 왜 R,G,B 속성을 Read-only로만 해두었을까요?



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/10/2021]


비밀번호

댓글 작성자
 




1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
1154정성태1/16/201220054.NET : 122. msiexec.exe를 닷넷으로 만들어 보면!파일 다운로드1
1153정성태1/2/201226460개발 환경 구성: 146. SYSTEM 권한으로 UI 프로그램 실행하는 방법
1152정성태1/2/201217363.NET : 121. PAARC - Windows Phone PC Controller
1151정성태11/30/201118628.NET : 120. Lua 스크립트와 닷넷의 연동
1150정성태11/9/201118262VS.NET IDE : 61. Game Debugging in Visual Studio 11
1149정성태11/4/201117617.NET : 119. Project2NuGet
1148정성태10/6/201119992Debug : 49. Visual Studio 11 - 커널 디버깅 #1
1147정성태9/17/201120937Windows 8: 1. Windows 8 단축키
1146정성태9/1/201120644SDK : 20. SxSTrace 도구 및 Visual C++ DLL을 함께 배포하는 방법
1145정성태7/5/201120169.NET : 118. Windows Phone 7에서의 DPAPI 사용
1144정성태6/29/201127485.NET : 117. CSV 파일을 다루는 방법 [1]
1143정성태6/23/201118838VS.NET IDE : 60. VS Load Test - 부하 조절
1142정성태6/23/201119809SDK : 19. LastWriteTime 과 ChangeTime 의 구분 [2]
1141정성태6/23/201118325.NET : 116. Entity Framework 4 - Lazy Loading, Eager Loading [1]
1140정성태6/23/201117763개발 환경 구성: 145. Using the multiple NICs of your File Server running Windows Server 2008 (and 2008 R2)
1139정성태6/22/201119264Visual C++ : 18. Visual C++ 2010에 포함된 Asynchronous Agents Library
1138정성태6/12/201117683.NET : 115. HTML 5 Host Application Framework for WP7 "MANGO”
1137정성태3/30/201117848SDK : 18. 파일을 Guid로 식별하는 함수 - OpenFileById
1136정성태3/30/201115361Web : 9. HTTPS 통신과 Keep-Alive 연결 설정
1135정성태3/28/201115892Web : 8. IE 9 - 변경된 Accept 헤더 정책
1134정성태3/28/201114977Debug : 48. Start Debugging with Windbg
1133정성태3/27/201114169Debug : 47. x64 호출 규약에서의 인자 값 찾는 방법
1132정성태3/27/201116412.NET 3.0 : 36. WCF - net.pipe 통신의 실제 Named Pipe 이름 구하는 방법
1131정성태3/27/201115224개발 환경 구성: 144. Windows Server 2008 R2 설치 및 설정
1130정성태3/1/201114999.NET : 114. Axum...
1129정성태2/14/201114646.NET : 113. Running .NET applications in-process using AppDomains
1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...