Skip to content

Formatters

Formatters are responsible for converting CLR objects to broker payloads and converting broker payloads back to CLR objects.

ServiceBus.Core keeps formatting separate from transport logic.

graph LR
    Object["CLR object"]
    Formatter["IDataFormatter"]
    Payload["byte[] payload"]
    Broker["Message broker"]

    Object --> Formatter
    Formatter --> Payload
    Payload --> Broker

Formatter Model

IDataFormatter works with the final binary payload used by the broker.

The general flow is:

graph LR
    Object["CLR object"]
    Json["JSON"]
    Encoding["Encoding"]
    Payload["byte[]"]

    Object --> Json
    Json --> Encoding
    Encoding --> Payload

The reverse flow is:

graph LR
    Payload["byte[]"]
    Encoding["Encoding"]
    Json["JSON"]
    Object["CLR object"]

    Payload --> Encoding
    Encoding --> Json
    Json --> Object

IDataFormatter vs IJsonSerializer

The formatter layer exposes two related but different abstractions.

Contract Responsibility
IDataFormatter Converts CLR objects to byte[] payloads and back.
IJsonSerializer Converts CLR objects to JSON strings and back.

IDataFormatter is used by broker clients.

IJsonSerializer is used internally by formatter implementations when a string-based JSON serializer is needed.


Available Implementations

Package Formatter
ServiceBus.Formatters.Ms MsJsonDataFormatter
ServiceBus.Formatters.Newtonsoft JsonDataFormatter
ServiceBus.Formatters.Newtonsoft RwJsonDataFormatter

Serializer Implementations

Package Serializer
ServiceBus.Formatters.Ms MsJsonSerializer
ServiceBus.Formatters.Newtonsoft JsonNetSerializer

Relationship With Clients

graph TD
    Publisher --> IDataFormatter
    Subscriber --> IDataFormatter
    IAsyncRestPublisher --> IDataFormatter
    IRestHostSubscriber --> IDataFormatter

Every client that sends or receives payloads requires an IDataFormatter.


Recommendation

Use one formatter implementation consistently across publishers and subscribers that exchange the same message contracts.

Both sides must agree on the payload format.