Die Serialisierung und Kodierung von Daten im SOAP basiert auf einem einfachen Typsystem, welches eine Verallgemeinerung der Gemeinsamkeiten der in bestehenden Programmiersprachen und Datenbanken vorhandenen Typsysteme darstellt. Ein Datentyp gehört entweder den einfachen Datentypen an, oder ist ein aus mehreren einfachen Datentypen konstruierter zusammengesetzter Datentyp.
Die Serialisierung von Daten erfolgt im SOAP in zwei Schritten. Zunächst muss aus dem der Anwendung zugrundeliegenden Datenmodell ein XML-Schema konstruiert werden. Danach wird aus diesem Schema und dem aktuellen Datenbestand die eigentliche XML- Datei erzeugt. Bei der Deserialisierung wird dann aus der XML-Instanz unter Kenntnis des zugrundeliegenden Schemas eine Kopie des Datenbestands erstellt.
Alle Werte werden durch den Inhalt von Elementen repräsentiert. Dabei muß für jedes nicht-leere Element der Datentyp des enthaltenen Werts auf eine der folgenden Arten angegeben werden: 1) Das Element besitzt das xsi:type-Attribut, durch welches der Typ definiert wird. 2) Das Element selbst befindet sich in einem Array, dessen Typ durch das SOAP- ENC:arrayType-Attribut definiert wurde. 3) Der Name des Elements enthält einen Hinweis auf den Datentyp, der dann aus der zugrundliegenden Schemadatei entnommen werden kann.
Ein einfacher Wert wird als Character Data, also ohne irgendwelche Subelemente, dargestellt. Er muß von einem in der XML Schema-Spezifikation aufgelisteten Typ sein. Dagegen besteht ein zusammengesetzter Datentyp aus einer Sequenz von Elementen, wobei jeder Teilwert von einem eigenen Unterelement repräsentiert wird.
Die SOAP-Spezifikation unterscheidet weiterhin zwischen unabhängigen und eingebetteten Werten. Unabhängige Werte stehen dabei in der obersten Ebene einer Serialisierung, sind also etwa direkte Kindelemente des Elements <SOAP-ENV:Body>. Alle anderen Elemente werden als eingebettete Elemente betrachtet.
Wird ein Element einfach ausgelassen, so impliziert dies entweder einen Default-Wert, oder, dass kein Wert bekannt ist. Normalerweise wird in diesem Fall der Null-Wert angenommen, wobei die exakte Null-Repräsentation sich nach dem Datentyp des Wertes richtet. Im Fall eines Boolschen Wertes impliziert die Abwesenheit False, im Fall eines Integers 0.
Das root-Attribut definiert Elemente, die nicht die echte Wurzel eines Objektbaumes sind, als Wurzeln, um diesen Baum deserialisierbar zu machen. Das Attribut kann einen der beiden Werte 0 oder 1 annehmen, wobei die echte Wurzel eines Objektbaumes einen impliziten Wert von 1 besitzt.