Per curiosità ho provato ad inserire solo il carattere dell'euro e solo altri caratteri per confrontare la stringa serializzata...

Mi torna questo:

a:4:{i:0;O:5:"odata":2:{s:2:"id";s:1:"1";s:5:"test o";s:3:"€";}i:1;O:5:"odata":2:{s:2:"id";s:1:"2";s:5:"testo";s:3:"€";}i:2;O:5:"odata":2:{s:2:"id";s:1:"3";s:5:"testo";s:1:"a";}i:3;O:5:"odata":2:{s:2:"id";s:1:"4";s:5:"testo";s:1:"$";}}

Analizzando la stringa ho notato che quando inserisco il simbolo € nella serializzazione invece di calcolare 1 carattere ne calcola 3

Ho colorato le parti incriminate a confronto

In arancio si nota che al simbolo euro abbiamo s:3 che è sballato essendo un solo carattere, infatti per il simbolo del $ o per una semplice "a" il valore s: è corretto, cioè 1

Non c'è nessuno che riesce a spiegarmi sta cosa?

Scusate se vi rompo le scatole.... :-)