레퍼런스
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), 한 글자씩 |
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에서 예외 처리는 아직 검증되지 않았고, 손상되거나 잘린 버퍼가 읽는 쪽 behaviour를 함께 끌고 내려가서는 안 됩니다. 쓴 것과 같은 순서로, 쓴 것 전부를 읽으세요. 형태가 틀렸다는 걸 알려주는 건 여기 없고, 읽기가 바이트 부족으로 멈췄다는 것만 알 수 있습니다.
Json
| 멤버 | 하는 일 |
|---|---|
Serialize<T>(T) |
자신의 ToJson()을 통해 T를 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 매개변수 조합이 아닙니다.
임의 타입의 필드를 훑는 리플렉션 기반 Serialize<T>는 없습니다. Udon에는 리플렉션이 전혀 없습니다 — 추측이 아니라 컴파일러에 직접 확인한 사실입니다. Deserialize<T>의 where T : new()도 리플렉션이 아닙니다. 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()가 있거나 이미 인스턴스를 만들어 둔 호출자가 있거나, 둘 중 하나 없이는 여기서 임의 타입을 만들어낼 방법이 없습니다.