There's MPASM __idlocs who allow to do it like so, for 16F you can have an ID from 0 to 0xFFFF, just use this simple line in your code
Code:
@   __idlocs  0xffff
However, you can't read it at run time, only 18F can

You could still use a data table
Code:
    GOTO OverSerial
    ASM
SERIALNUMBER
    DT "123456789ab",0
    ENDASM
OverSerial:
     SERIALNUMBER CON EXT
this will be stored in your code space and you can read it anytime with a READCODE loop using SERIALNUMBER constant as your start address.

hth