The buffer can for example be decoded using zlib.
If Encoding is 1, the Contents is a deflate/zip-compressed buffer of length CompressedLength bytes. If Encoding is 0, the Contents is just ArrayLength times the array data type.
( Note: it is not entirely clear why the NULL entry is required. Behind that object record, there is 13 zero bytes, which should then match up with the EndOffset. If so, recursively read an object record directly following the last property. To determine whether a nested list entry exists, check if there is bytes left until the EndOffset is reached. Reading a node record up to and including the properties is straightforward.