hazelcast-nodejs-client icon indicating copy to clipboard operation
hazelcast-nodejs-client copied to clipboard

API-1415 Nested compact field's serializer can be undefined if it is not registered

Open srknzl opened this issue 3 years ago • 1 comments

Error:

TypeError: Cannot read property 'getClass' of undefined
    at CompactStreamSerializer.writeObject (/home/serkan/forked/hazelcast-nodejs-client/lib/serialization/compact/CompactStreamSerializer.js:104:41)
    at /home/serkan/forked/hazelcast-nodejs-client/lib/serialization/compact/DefaultCompactWriter.js:103:36
    at DefaultCompactWriter.writeVariableSizeField (/home/serkan/forked/hazelcast-nodejs-client/lib/serialization/compact/DefaultCompactWriter.js:278:13)
    at DefaultCompactWriter.writeCompact (/home/serkan/forked/hazelcast-nodejs-client/lib/serialization/compact/DefaultCompactWriter.js:102:21)
    at MainDTOSerializer.write (/home/serkan/forked/hazelcast-nodejs-client/test/integration/backward_compatible/parallel/serialization/compact/CompactUtil.js:1295:20)
    at CompactStreamSerializer.writeSchemaAndObject (/home/serkan/forked/hazelcast-nodejs-client/lib/serialization/compact/CompactStreamSerializer.js:99:27)
    at CompactStreamSerializer.writeObject (/home/serkan/forked/hazelcast-nodejs-client/lib/serialization/compact/CompactStreamSerializer.js:112:14)
    at CompactStreamSerializer.write (/home/serkan/forked/hazelcast-nodejs-client/lib/serialization/compact/CompactStreamSerializer.js:69:18)
    at SerializationServiceV1.toData (/home/serkan/forked/hazelcast-nodejs-client/lib/serialization/SerializationService.js:82:20)
    at MapProxy.toData (/home/serkan/forked/hazelcast-nodejs-client/lib/proxy/BaseProxy.js:129:42)

To reproduce:

Put the following file in test/unit/serialization/compact and run it. Since InnerDTO is a nested compact CompactStreamSerializer is used without checking if it is compact serializable or not, and serializer variable here becomes undefined. As a fix, we should check if there is a serializer explicitly before that line.

'use strict';
const {Client} = require('../../../../lib');
const {
    createMainDTO,
    MainDTOSerializer,
    NamedDTOSerializer,
} = require('../../../integration/backward_compatible/parallel/serialization/compact/CompactUtil');


async function main() {
    const serializers = [new MainDTOSerializer(), new NamedDTOSerializer()];
    const client = await Client.newHazelcastClient({
        serialization: {
            compact: {
                serializers
            }
        }
    });

    const map = await client.getMap('test');
    const mainDTO = createMainDTO();
    await map.set('1', mainDTO);
    console.log((await map.get('1')));
    await client.shutdown();
}

main().catch(err => {
    console.error(err);
    process.exit(1);
});

srknzl avatar Jun 24 '22 12:06 srknzl

Internal Jira issue: API-1415

github-actions[bot] avatar Jun 24 '22 12:06 github-actions[bot]