Serializacja to konwersja obiektów do stringa w taki sposób, by była mozliwe jego ponowne odtworzenie. Tu nie ma wiele zabawy, gdyż są do tego gotowe metody w php. Co do symfony2 to ona też ma do tego wbudowane mechanizmy poprzez adnotacje choćby czy serializery. Tu raczej więc nie ma większych problemów. Co do anonimowych uzytkowników, można zrobić to choćby tak, ze po wejściu do sklepu nie robisz nic, ale każdy użytkownik ma sesję i dostęp do koszyka. Może w każdej chwili zalogować, ale nie jest to konieczne dla procesu wybierania. Gdy dochodzi do procesu zakupu możesz rozwiązać to na kilka sposobów. Możesz zaproponować jedno z kilku rozwiązań, ale sprowadzają się one do tak naprawdę 4 przypadków:
- prosisz użytkonika o zalogowanie jeśli ma konto,
- proponujesz założenie konta,
- zakładasz konto niejawnie lub o krótkim czasie ważności,
- pozwalasz na podanie danych do wysyłki.
Gdy tworzysz jakiekolwiek konto - nie ma problemu. Możesz przykładowo ograniczyć liczbę pól wymaganych by po prostu walidacja takiego konta przeszła (validation groups się kłaniają). Gdy pozwalasz na wysyłke bez tworzenia konta, musisz mieć możliwość zachowania danych do wysyłki w innej postaci. Własnie tutaj można zrobić sobie zadanie "od końca". Transakcje moga być zrobione na różne sposoby. Możesz przechowywać dane na sposoby podręcznikowe, czyli optymalizując tabele by pozbyć redundantnych danych. Możesz też spreparowac dane by wykorzystać je od razu przy wysyłce. Ale tutaj niemal na pewno wystąpi powtórzenie danych. Kwestia więc estetyki i miejsca na dysku czy w bazie

Jako że osobiście nie ufam w niezmienność danych typu cena czy podatek VAT na produkty, wolę dane takie zapisywać w momencie transakcji, by mieć punkt odniesienia. W takiej sytuacji mogę sobie tabelę transakcji zapisać jako:
id_transakcji, id_usera, transkcja. Czemu tak? Pierwsze pole nie wymaga wyjaśnień. Drugie przechowuje id_usera w systemie. Jeśli jest tam liczba, wiem że muszę podstawowych danych adresowych szukać w profilu usera o danym id. jeśli brak, user jest anonimowy i danych wysyłki szukam w polu transakcji. A co jeśli user ma inne dane w profilu, a na inne chce wysłać? Formularz transakcji i jedna z opcji to zmiana adresu wysyłki. Można dodatkowo dodać checkboxy, czy dane te mają stać się profilowymi, a może także domyślnymi dla dalszych wysyłek. Jak widzisz, jest dużo możliwości. Oczywiście wygodnie jest wtedy zapisac ów adres wysyłki także do transakcji. Sama transakcja to dla mnie właśnie zserializowane dane o całości zamówienia.