屬性集序列化

屬性集序列化格式有兩個版本。 原始規格描述第 0 版的格式。 如需詳細資訊 ,請參閱格式版本 。 第 1 版會擴充原始版本。 所有第 0 版屬性集都有效為第 1 版屬性集。 序列化屬性集標頭中的 [格式版本 ] 欄位表示版本。

下列專案會識別第 0 版和第 1 版屬性集序列化格式之間的差異。

  • 支援新的 VARTYPE 值。 如需 VARTYPE 值及其使用方式的詳細資訊,請參閱 IDispatch 資料類型和結構 主題和 PROPVARIANT 結構。

    第 0 版屬性集不支援下列 VARTYPE 值,但第 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 屬性是 屬性識別碼,0x80000003 類型為 VT_UI4。 如果設定這個值的最低位,屬性集名稱會區分大小寫。 在IPropertySetStorage::Create方法的grfFlags參數中設定 PROPSETFLAG_CASE_SENSITIVE 旗標,以指定區分大小寫的屬性集。

  • 長屬性名稱。 第 0 版屬性集的屬性名稱必須小於或等於 256 個字元,包括 Unicode 字碼頁中屬性集的字串結束字元。 如果不是在 Unicode 字碼頁中,它們必須小於 256 個位元組。 另一方面,第 1 版屬性集可以具有無限制長度的屬性名稱,不過它們仍然受限於 256 KB (KB 的整體屬性集大小限制) 。

根據預設, 建議實作 IPropertyStorage 建立和維護第 0 版屬性集。 如果呼叫端後續要求第 1 版特定的功能格式,則應該更新屬性集的版本。 例如,如果寫入類型為 VT_ARRAY 的屬性,或寫入長屬性名稱,則實作應該將屬性集格式更新為第 1 版。 如果在 呼叫 IPropertySetStorage::Create中指定了PROPSETFLAG_CASE_SENSITIVE列舉值,就會發生此指導方針的一個例外狀況。 在此情況下,屬性集必須建立為第 1 版屬性集。