구성 요소 공급 업체가 VCL 구성 요소를 업그레이드하는 영역에서 구성 요소를 파일로 직렬화하고 다시 읽는 문제가있는 사람이 있습니까? 예를 들어, DelphiX로 직렬화 된 파일은 몇 년 후 delphiY로 다시 읽습니다. 직렬화 형식이 변경 되었습니까? 그렇다면 업그레이드시 구성 요소에서 읽는 오류를 방지하기 위해 수행 할 수있는 작업.Delphi 구성 요소 직렬화
답변
게시 된 속성을 serialize하기 위해 기본 제공되는 RTTI 기반 시스템은 구성 요소의 변경에 취약합니다. 이전 속성은 새 객체에 유지되는 한 관리가 가능합니다. 나는. 속성 인터페이스는 그대로 두지 만 원하는 경우 내용을 버릴 수 있습니다. 이전 버전의로드에서는 새 버전 저장 속성을 열 수 없으므로 문제가 될 수 있습니다.
XML 형식의 직렬화를 추가 할 수있는 구성 요소/라이브러리 (http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes)가 있는데, 이것은 모르는 내용을 건너 뛰도록 선택할 수 있으므로 약간 도움이 될 수 있습니다.
게시 된 콘텐츠를 디자인하는 방법에 대해 여전히주의해야하며 현재 버전에서 이해하지 못하는 콘텐츠를 "무시하지만 전파"하는 방법을 찾아야합니다. 이렇게하면 더 새로운 속성을 유지하면서 새로운 형식으로 파일을 열고 변경하는 대신 스트라이핑 할 수 있습니다.
공급 업체가 구성 요소에 기능을 추가하기 때문에 형식이 변경됩니다. 직렬화는 게시 된 모든 속성을 반복하고 스트림에 저장합니다. 스트림을 읽어 들일 때 스트림에서 읽은 각 속성은 구성 요소로 다시 설정됩니다. 속성이 더 이상 존재하지 않으면 문제가 발생합니다. 기본적인 예외 처리 외에는 아무 것도 할 수 없다고 생각합니다.
호환성을 보장하는 가장 좋은 방법은 사용자 고유의 직렬화를 수행하는 것입니다.
답장을 보내 주셔서 감사합니다. 사용자 지정 직렬화를 피하고 각 구성 요소 직렬화 기술을 활용하려고했지만 opf가 부족하여 새로운 구성 요소 형식으로 업그레이드하는 "패치"를 할 수있는 방법은 사용자 지정 직렬화가 유일한 방법이라고 생각합니다.
오래된 버전과 더 이상 사용되지 않는 매개 변수에 대한 지원을 읽는 한 새로운 버전을 만들 수 있습니다. 문제는 사용자 지정 직렬화없이 수행 할 수없는 새 스트림을 읽도록 이전 릴리스를 가져 오는 것입니다. –
VCL- 스트리밍을 사용하면 Classes.TReader를 직접 사용하고 OnError 이벤트에 대한 처리기를 작성할 때 누락 된 속성 (누락 된 클래스 및 기타 오류도 처리 할 수 있음)을 처리 할 수 있습니다. 클래스 단위에서 필요한 모든 코드를 찾았습니다. 가장 큰 단점은 클래스/클래스가 TComponent 또는 적어도 TPersistent에서 파생되어야한다는 것입니다. –