シリアライザ
概要
シリアライザを使うことで、オブジェクトをバイト列に変換してオブジェクトを保存したり、他のセッションに送信することができます。
これにより、オブジェクトを保存する際にJSONに対応した文字列に変換する必要がなくなるため、データ量の節約や高速化が期待できます。
Serializable型
2つのメソッドserialize
, deserialize
を実装することでシリアライザを定義できます。
1 | export interface Serializable<T, D> { |
2 | serialize(data: T): D; |
3 | deserialize(data: D): T; |
4 | } |
シリアライザの作成
シリアライザを作成するにあたって、すべて自前で実装することもできますが、ByteReader
, ByteWriter
を使うことで簡単にバイト列を扱うことができます。
1 | import type { Serializable } from '@omujs/omu'; |
2 | import { ByteReader, ByteWriter } from '@omujs/omu'; |
3 |
|
4 | type MyData = { |
5 | byteArray: Uint8Array; |
6 | date: Date; |
7 | }; |
8 |
|
9 | const mySerializer: Serializable<MyData, Uint8Array> = { |
10 | serialize(data) { |
11 | const writer = new ByteWriter(); |
12 | writer.writeByteArray(data.byteArray); |
13 | writer.writeString(data.date.toISOString()); |
14 | return writer.finish(); |
15 | }, |
16 | deserialize(data) { |
17 | const reader = new ByteReader(data); |
18 | const byteArray = reader.readByteArray(); |
19 | const date = new Date(reader.readString()); |
20 | reader.finish(); |
21 | return { byteArray, date }; |
22 | }, |
23 | }; |
使用例
例としてsignal機能をシリアライザと組み合わせて使う方法を示します。
1 | const DEFAULT_MY_DATA: MyData = { |
2 | byteArray: new Uint8Array(), |
3 | date: new Date(), |
4 | }; |
5 |
|
6 | const mySignal = omu.signals.create<MyData>('my_data', { |
7 | serializer: mySerializer, |
8 | }); |
9 |
|
10 | await mySignal.notify({ |
11 | byteArray: new Uint8Array([1, 2, 3]), |
12 | date: new Date(), |
13 | }) |
14 |
|
15 | mySignal.listen((data: MyData) => { |
16 | console.log(data.byteArray); |
17 | console.log(data.date); |
18 | }); |