@Override
    public void writeExternal( ObjectOutput out ) throws IOException
    {
        final ExternalizableUtil util = ExternalizableUtil.getInstance();
        util.writeSafeUTF( out, accessModel.getName() );

        util.writeLong( out, affiliates.size() );
        for ( final NodeAffiliate affiliate : affiliates )
        {
            util.writeSerializable( out, affiliate.getJID() );
            util.writeBoolean( out, affiliate.getAffiliation() != null );
            if ( affiliate.getAffiliation() != null ) {
                util.writeSafeUTF( out, affiliate.getAffiliation().name() );
            }
        }

        util.writeSafeUTF( out, bodyXSLT );
        util.writeSerializableCollection( out, contacts );
        util.writeSerializable( out, creationDate );
        util.writeSerializable( out, creator );
        util.writeSafeUTF( out, dataformXSLT );
        util.writeBoolean( out, deliverPayloads );
        util.writeSafeUTF( out, description );
        util.writeSafeUTF( out, language );
        util.writeSerializable( out, modificationDate );
        util.writeSafeUTF( out, name );
        util.writeSafeUTF( out, nodeID );
        util.writeBoolean( out, notifyConfigChanges );
        util.writeBoolean( out, notifyDelete );
        util.writeBoolean( out, notifyRetract );
        util.writeBoolean( out, parentIdentifier != null );
        if (parentIdentifier != null) {
            util.writeSerializable( out, parentIdentifier );
        }
        util.writeSafeUTF( out, payloadType );
        util.writeBoolean( out, presenceBasedDelivery );
        util.writeSafeUTF( out, publisherModel.getName() );
        util.writeBoolean( out, replyPolicy != null );
        if ( replyPolicy != null)
        {
            util.writeSafeUTF( out, replyPolicy.name() );
        }
        util.writeSerializableCollection( out, replyRooms );
        util.writeSerializableCollection( out, replyTo );
        util.writeSerializableCollection( out, rosterGroupsAllowed );
        util.writeBoolean( out, savedToDB );
        util.writeSerializable(out, serviceIdentifier);
        util.writeBoolean( out, subscriptionConfigurationRequired );
        util.writeBoolean( out, subscriptionEnabled );

        // write out subscriptions once. When reading, use them to populate both maps.
        final Collection<NodeSubscription> subscriptions = subscriptionsByID.values();
        util.writeInt( out, subscriptions.size() );
        for ( final NodeSubscription subscription : subscriptions )
        {
            util.writeSerializable( out, subscription.getOwner() );
            util.writeSerializable( out, subscription.getJID() );
            util.writeSafeUTF( out, subscription.getState().name() );
            util.writeSafeUTF( out, subscription.getID() );
        }
    }
A unique identifier for a node, in context of all services in the system.

The properties that uniquely identify a node are its service, and its nodeId.
xmppserver/src/main/java/org/jivesoftware/openfire/pubsub/Node.java