リファレンス
ByteWriter、ByteReader、Json、IJsonSerializable のすべてのメンバー。
すべて Udonite.Serialization にあります。
ByteWriter
new ByteWriter() // 既定の初期容量
new ByteWriter(64) // バイト単位の初期容量。必要になれば超えて伸びる
| メンバー | 書き込むもの |
|---|---|
WriteByte(byte) |
1 バイト |
WriteBoolean(bool), WriteChar(char) |
固定長 |
WriteInt16, WriteUInt16, WriteInt32, WriteUInt32, WriteSingle, WriteDouble |
固定長。System.BitConverter を使用 |
WriteString(string) |
長さ付き(null は 0)。1 文字ずつ |
WriteBytes(byte[]) |
長さ付きの生バイト列——ネストしたペイロードが通る継ぎ目 |
WriteVector2, WriteVector3, WriteQuaternion |
成分ごと |
WriteLength(int) |
必要最小限のバイト数で表した個数。127 まで 1 バイト、16383 まで 2 バイト |
Position { get; } |
ここまでに書いたバイト数 |
Reset() |
新しいバッファを確保せずに空へ巻き戻す |
ToArray() |
ちょうどのサイズのコピー。余分に確保した末尾は含まれない |
Write 系のメソッドはすべて this を返すので連結できます:new ByteWriter().WriteInt32(1).WriteString("a")。
意図的に絞った核であり、System.BitConverter をそのまま写したものではありません。 64 ビット整数も、符号付き 8 ビットも、short より狭い 16 ビットも、Vector2Int もありません。reached なクラスは丸ごとコンパイルされ、宣言したメソッドはプログラムが生きている間ずっとヒープを食います。ここにあるのはペイロードが実際に運びそうなものだけです。
ByteReader
new ByteReader(bytes)
| メンバー | 読むもの |
|---|---|
ReadByte() |
1 バイト |
ReadBoolean(), ReadChar() |
固定長 |
ReadInt16, ReadUInt16, ReadInt32, ReadUInt32, ReadSingle, ReadDouble |
固定長 |
ReadString() |
WriteString のペイロードを読み戻す |
ReadBytes() |
WriteBytes のペイロードを読み戻す |
ReadVector2, ReadVector3, ReadQuaternion |
成分ごと |
ReadLength() |
WriteLength の個数を読み戻す |
Position { get; }, Length { get; }, LengthRemaining { get; } |
カーソルの位置、バッファの大きさ、残りバイト数 |
SetBuffer(byte[]) |
別のバッファでこのリーダーを使い回す。カーソルは先頭に戻る |
バッファの終わりを超えて読んでも、例外にはならずログを出してその型のデフォルト値を返します。 例外処理は Udonite ではまだ確かなものではなく、壊れたバッファや途中で切れたバッファが読み込み側のビヘイビアを道連れにしてはいけません。書いたのと同じ順番で、書いたぶんすべてを読んでください。形が違っていたことを教えてくれるものはここにはなく、読み込みがバイト不足で止まったことしか分かりません。
Json
| メンバー | すること |
|---|---|
Serialize<T>(T) |
T を自分の ToJson() を通じて JSON に詰める。T が null か VRCJson が拒否すれば null |
Deserialize<T>(string) |
JSON を解析し、新しい T を組み立て(where T : class, IJsonSerializable, new())、FromJson を通じて埋める。不正な JSON なら null |
Serialize(DataToken), Serialize(DataToken, bool pretty) |
その場限りで組み立てた、決まった型のない JSON のための低レベルな形 |
Deserialize(string) |
DataToken? をそのまま返す。同じ逃げ道の逆方向 |
一貫して失敗時は null。 bool と out 引数の組み合わせではありません。
任意の型のフィールドを走査する reflection ベースの Serialize<T> はありません。 Udon には reflection がまったくありません——これは推測ではなく、コンパイラに対して直接確かめたことです。Deserialize<T> の where T : new() も reflection ではありません。C# コンパイラが呼び出し箇所で解決する制約であって、ここから Activator.CreateInstance を呼ぶことはできなくても、これは動きます。
JSON の数値はすべて TokenType.Double として解析されます。整数として書いたものでも同じです。 {"score": 42} は .Int が例外を投げるトークンとして解析されます——読めるのは .Double(必要な型へキャストして使う)だけです。これは VRCJson 自体の性質であって、このラッパーが変えられるものではありません。
IJsonSerializable
| メンバー | すること |
|---|---|
DataToken ToJson() |
このインスタンスを詰める。多くは DataDictionary に |
void FromJson(DataToken token) |
ToJson が作ったものからこのインスタンスを埋める |
どちらのメソッドも触れなかったフィールドは、送られることも埋められることもありません。ここには型のメンバーを自動で調べる仕組みは一切ありません。FromJson は新しいインスタンスを返すのではなく、呼ばれたインスタンス自身を書き換えます。Udonite Net の NetworkEvent.Deserialize と同じやり方です。ここには new() か、すでにインスタンスを持っている呼び出し側かのどちらかがなければ、任意の型を組み立てる手段がありません。