Skip to content

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

@srknzl

Description

@srknzl

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);
});

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions