Jepsen.io has a good explainer: https://jepsen.io/consistency/models/serializable
The classic example, related to mine, which shows the difference is with the following two queries:
update balls set color=0 where color=1; update balls set color=1 where color=0;
Under (mathematical) serializability, all the balls must be the the same color. However, under snapshot isolation (serializable according to the SQL standard), it is also possible to just have the colors swapped in case both queries read the same version.
You can verify it yourself, but this is not any one of the typical anomalies since both transactions neither read nor write to the same rows. A phantom read does not occur since each transaction only does a single read operation.