2011-08-30 5 views
3

Delphi에서 Object를 직렬화하고 싶습니다. 새로운 RTTI를 사용하고 있습니다. 그러나 저장소에서 값을로드 할 때 문자열, s로 다시 검색되며 TRttiProperty.SetValue는 두 번째 인수로 TValue가 필요합니다. 따라서 '5.1'또는 '5'로 double로 선언 된 속성 값을 설정할 때 예외가 발생합니다.값을 문자열로 가질 때 문자열이 아닌 속성에 TRttiProperty.SetValue를 호출하려면 어떻게해야합니까?

또한 TValue.From() 메서드를 사용하여 성공하지 못했습니다.

여기는 잘못된 부분을 설명하는 코드입니다.

var P: TRttiProperty; 

.... 

// P now is the property which is declared as a double or integer 
P.SetValue(Self, '3'); //<-- this raises an exception. 

편집 : 질문이 문자열 데이터 유형을 사용하여, 문자열 유형이 아닌 속성 값을 설정하는 얻는 방법이지만, 이는 유효한 데이터가 포함되어 있습니다. (위의 경우와 같은)

+0

@Rob : 텍스트에 직렬화 된 숫자를 읽고 deserialize하려는 숫자처럼 보이며 문자열 -> 숫자 형식의 암시 적 변환이 부족하여 혼란 스럽습니다. –

+0

질문을 편집하여 내가 원하는 내용에 대한 설명을 추가합니다. – zz1433

답변

6

네, 숫자 속성에 '3'(문자열)을 지정하려고합니다. RTTI 시스템은 암시 적 유형 변환을 수행하지 않습니다.

procedure DeserializeProperty(P: TRttiProperty; s: string); 
var 
    v: TValue;  
begin 
    case p.PropertyType.TypeKind of 
    tkInteger: v := StrToInt(s); 
    tkFloat: v := StrToFloat(s); 
    tkString: v := s; 
    end; 
    p.SetValue(self, v); 
end; 

이 분명 완성 된 제품이 아닙니다, 그러나 당신이 시작하는 데 충분해야한다 :이 같은 것을보십시오.

+0

그래,이 트릭을 했어. 고마워요! – zz1433

관련 문제