Мой старый сайт и зеркало-архив (осторожно, на сайте реклама!)
BedvitCOM.VariantSerialization()
Часть библиотеки BedvitCOM
Cериализация и десериализация типа данных Variant, используемый в COM, VB, VBA, C++, Python и других поддерживающих СОМ языков
Поддерживаются базовые типы и массивы. Объекты не сериализуются.
В некоторой степени - аналог CComVariant::ReadFromStream и CComVariant::WriteToStream
Функции:
VARIANT byteArrayOutRetval = VariantSerialization(VARIANT variantIn)
VARIANT variantOut= VariantDeserialization(VARIANT byteArrayOutRetval)
Параметры функции:
1. variantIn/variantOut- входящий/получаемый VARIANT - значение или массив значений
2. byteArrayOutRetval - массив байтов
Особенности:
1. Cериализация в байтовый массив
2. Размер массива не может превышать 2^32 элементов (около 4Гбайт). Это ограничение самого COM - массива. В С++ (в другом контейнере) сохранял файлы боле 4,5 Гб.
3. Реализован похожий механизм (shared string table), как и в Excel, для оптимизации размера одинаковых строк.
Пример использования
[VBA]
Sub TestVariantSerialization()
'Dim bVBA As New BedvitCOM.VBA 'раннее связывание
Dim bVBA As Object: Set bVBA = CreateObject("BedvitCOM.VBA") 'позднее связывание
Dim t, arr, byteArr
Range("A:B").value2 = "Tst Srl ёя"
t = Timer
byteArr = bVBA.VariantSerialization(Range("A:B").value2)
arr = bVBA.VariantDeserialization(byteArr)
Debug.Print "VariantSerialization+VariantDeserialization " & Timer - t & " s."
Range("D:E").value2 = arr
End Sub
[/VBA]