속성 집합 직렬화

속성 집합 serialization 형식에는 두 가지 버전이 있습니다. 원래 사양은 형식의 버전 0을 설명합니다. 자세한 내용은 버전 서식 을 참조하세요. 버전 1은 원래 버전을 확장합니다. 모든 버전 0 속성 집합은 버전 1 속성 집합으로 유효합니다. 직렬화된 속성 집합의 헤더에 있는 버전 서식 필드는 버전을 나타냅니다.

다음 항목은 버전 0과 버전 1 속성 집합 serialization 형식 간의 차이점을 식별합니다.

  • VARTYPE 값을 지원합니다. VARTYPE 값 및 사용 방법에 대한 자세한 내용은 IDispatch 데이터 형식 및 구조 및PROPVARIANT 구조 항목을 참조하세요.

    다음 VARTYPE 값은 버전 0 속성 집합에서 지원되지 않지만 버전 1에서 지원됩니다.

    VT_I1

    VT_VECTOR | VT_I1

    VT_INT

    VT_UINT

    VT_DECIMAL

    또한 SafeArrays는 속성 집합에서 직렬화할 수 있습니다. SafeArray의 존재는 OR 연산을 사용하여 PROPVARIANT 구조체의 vt 멤버에 있는 배열 요소와 결합된 VT_ARRAY 비트로 표시됩니다. 예를 들어 서명된 4바이트 정수의 SafeArray에는 VT_ARRAY 형식이 있습니다. VT_I4.

    다음 요소 형식은 직렬화된 속성 집합의 SafeArray에 유효합니다.

           
    VT_I1 VT_UI1 VT_I2 VT_UI2
    VT_I4 VT_UI4 VT_INT VT_UINT
    VT_R4 VT_R8 VT_CY VT_DATE
    VT_BSTR VT_BOOL VT_DECIMAL VT_ERROR
    VT_VARIANT      
         

    VT_VARIANT 데이터 형식을 지정하면 SafeArray 자체에 PROPVARIANT 구조체가 있음을 나타냅니다. 이러한 요소의 형식은 중첩된 VT_VARIANT 형식을 포함할 수 없다는 점을 제외하고 이전 목록의 형식이어야 합니다.

    IPropertyStorage의 구현은 새 형식이 발견되었을 때 오류를 반환하여 정상적으로 복구할 수 있어야 합니다. 예를 들어 VARENUM 형식입니다.

  • 대/소문자 구분 속성 이름입니다. 속성 이름(예: IPropertyStorage::WritePropertyNames 메서드에 지정된 이름)은 버전 0 속성 집합에서 대/소문자를 구분하지 않습니다. 버전 1 속성 집합에서 속성 이름은 새 Behavior 속성의 값에 따라 대/소문자를 구분할 수 있습니다.

    Behavior 속성은 VT_UI4 형식의 속성 ID 0x80000003. 이 값의 가장 낮은 비트가 설정된 경우 속성 집합 이름은 대/소문자를 구분합니다. 대/소문자를 구분하는 속성 집합을 지정하려면 IPropertySetStorage::Create 메서드의 grfFlags 매개 변수에서 PROPSETFLAG_CASE_SENSITIVE 플래그를 설정합니다.

  • 긴 속성 이름입니다. 버전 0 속성 집합의 속성 이름은 유니코드 코드 페이지의 속성 집합에 대해 문자열 종결자를 포함하여 256자 미만이거나 같아야 합니다. 유니코드 코드 페이지에 없는 경우 256바이트 미만이어야 합니다. 반면 버전 1 속성 집합에는 길이가 무제한인 속성 이름이 있을 수 있지만 전체 속성 집합 크기 제한은 256KB(KB)로 제한됩니다.

IPropertyStorage 구현은 기본적으로 버전 0 속성 집합을 만들고 유지 관리하는 것이 좋습니다. 호출자가 이후에 버전 1 형식과 관련된 기능을 요청하는 경우 속성 집합의 버전을 업데이트해야 합니다. 예를 들어 VT_ARRAY 형식의 속성이 작성되거나 긴 속성 이름이 기록된 경우 구현은 속성 집합 형식을 버전 1로 업데이트해야 합니다. 이 지침의 한 가지 예외는 IPropertySetStorage::Create 호출에서 PROPSETFLAG_CASE_SENSITIVE 열거형 값이 지정된 경우에 발생합니다. 이 경우 속성 집합을 버전 1 속성 집합으로 만들어야 합니다.