# Class serializer

**@node-ts/bus-class-serializer** leverages [class transformer](https://www.npmjs.com/package/class-transformer) to provide serialization/deserialization to class instances. This means that class based properties of messages like javascript Dates can be consumed directly without having to do additional custom deserialization in each handler.

### Installation

Install **@node-ts/bus-class-serializer** and its dependencies

```bash
npm install @node-ts/bus-class-serializer reflect-metadata class-transformer
```

Configure bus to use the serializer

```typescript
import { Bus } from '@node-ts/bus-core'
import { ClassSerializer } from '@node-ts/bus-class-serializer'

Bus
  .configure()
  .withSerializer(new ClassSerializer())
  .initialize()
```

{% hint style="info" %}
This package relies on [class transformer](https://www.npmjs.com/package/class-transformer) that requires [reflect-metadata](https://www.npmjs.com/package/reflect-metadata) to be installed and called at the start of your application before any other imports. Please follow their guides on how to configure your app and contracts to serialize correctly.
{% endhint %}

### Strongly typed messages

Once the **@node-ts/bus-class-serializer** has been installed and configured, you can consume class transformer notation for object properties of your messages.&#x20;

For example

```typescript
import { Command } from '@node-ts/bus-messages'
import { Type } from 'class-transformer'

class Update extends Command {
  // Provide a @Type hint so that class-transformer can deserialize this at runtime
  @Type(() => Date) readonly date: Date
  constructor (
    date: Date
  ) {
    this.date = date
  }
}
```
