server | v4 switch to v3  

Photonでのシリアル化

Photonとクライアントは、非常に最適化されたバイナリプロトコルを通信に使用しています。 このバイナリプロトコルは簡潔で、容易に解析できます。

Photonは送信前に、すべてのデータをこのバイナリプロトコルに変換する必要があります。 この処理は、通常使用されるデータ型について自動的に実行されます。 ほとんどのクライアントAPIでは、必要となる他のクラスに独自のシリアル化手順を登録することも可能です。 以下を参照してください。

Contents

Photonでサポートされている型

下記のタイプは通常サポートされていて、Photonのバイナリプロトコルとして知られています。
言語によってはリストにある全ての型を提供していませんので、SDKによっては型のサポートが少ないものもあります。

Type (C#) Size [bytes] Description
byte
2
8 bit unsigned
boolean
2
true or false
short
3
16 bit
int
5
32 bit
long
9
64 bit
float
5
32 bit
double
9
64 bit
string
3 + size( UTF8.GetBytes(string) )
< short.MaxValue length
byte-array
5 + 1 * length
< int.MaxValue length
int-array
5 + 4 * length
< int.MaxValue length
array of <type>
4 + size(entries) - count(entries)
< short.MaxValue length
hashtable
3 + size(keys) + size(values)
< short.MaxValue pairs
dictionary
3 + size(keys) + size(values)
< short.MaxValue pairs
additional size if K- or V-type is object

Back To Top

Photon Unity Networkingで追加された型

(英語版にはありませんでした)

(英語版にはありませんでした)

Type (C#) Size [bytes] Description
Vector2 12 2 floats
Vector3 16 3 floats
Quaternion 20 4 floats
PhotonPlayer 8 integer PhotonPlayer.ID

Back To Top

カスタムタイプ

上記リストに含まれていない型の場合、重要な値をシリアライズ化または非シリアライズ化する必要があります。

基本的には二つのメソッドを書いてクラスをバイト配列に変換してから戻します。その後にそれをPhoton APIに登録します。 登録が完了すれば、メッセージにその型のインスタンスを含むことができます。

Photonが登録された型のシリアライズ化メソッドを呼び、自動的に作成したバイト配列(4byte)と必要なタイプ情報をプリフィックスします。 4 byteのオーバーヘッドがあるので、byteの少ないデータの登録は避けた方が良いかもしれません。

Photon Serverは不明のカスタムタイプをそのまま転送することもできます。このため、Photon Cloudではタイプの登録をする必要がありません。

通信する全てのクライアントにカスタムタイプを登録してください。

Back To Top

サーバ上でカスタムタイプを登録

Photon Serverのシリアル化で不明なタイプを登録するには、TryRegisterCustomTypeを使います。

    Protocol.TryRegisterCustomType(typeof(MyCustomType), myCustomTypeCode, MyCustomType.Serialize, MyCustomType.Deserialize);

タイプをbyte-arrayに書き込んで受信側に再生成するには二つの方式が必要です。例として、MyCustomTypeを実装しました:

public class MyCustomType
{
  public byte Id { get; set; }

  public static object Deserialize(byte[] data)
  {
    var result = new MyCustomType();
    result.Id = data[0];
    return result;
  }

  public static byte[] Serialize(object customType)
  {
    var c = (MyCustomType)customType;
    return new byte[] { c.Id };
  }
}

ドキュメントのトップへ戻る