0

オブジェクトと文字列をクライアント アプリケーションからサーバー アプリケーションに送信する Adob​​e SocketServer コードの例を見ていきます。

私が見ているsendStringsメソッドで

var bytes:ByteArray=new ByteArray();
            bytes.writeInt(TYPE_STRING); //message type
            bytes.writeObject(text);
            bytes.position=0;

しかし、文字列データを送信しているのに、なぜバイトに変換するのでしょうか? 文字列データをシリアル化する利点を説明できる人はいますか?

4

1 に答える 1

0

これは、Adobe SocketServer のプロトコル要件にすぎないと思います。AMF は、文字列にも UTF を使用するため、単一オブジェクトの文字列に対して利点はありません。

package
{
import flash.display.Sprite;
import flash.utils.ByteArray;

public class astest extends Sprite
{
    public function astest()
    {
        var str:String = "sdfKdkhsdfn345k4jhskdfhsdkf34k,,mancoasdc2";

        var bytesUTF:ByteArray = new ByteArray();
        bytesUTF.writeUTF(str);

        var bytesAMF:ByteArray = new ByteArray();
        bytesAMF.writeObject(str);

        var hexUTF:String = getHexBytesString(bytesUTF);
        var hexAMF:String = getHexBytesString(bytesAMF);
        trace("hexUTF:", hexUTF, bytesUTF.length, "bytes");
        trace("hexAMF:", hexAMF, bytesAMF.length, "bytes");

        trace(hexUTF.substr(4) == hexAMF.substr(4));

    }

    public static function getHexBytesString(array:ByteArray, colons:Boolean=false, position:int = 0):String {
        var s:String = "";
        var len:uint = array.length;
        for (var i:int=position;i<len;i++) {
            s+=("0"+array[i].toString(16)).substr(-2,2).toUpperCase();
            if (colons && i<array.length-1) s+= "-";
        }
        return s;
    }

}
}

出力:

hexUTF: 002A7364664B646B687364666E3334356B346A68736B64666873646B6633346B2C2C6D616E636F6173646332 44 bytes
hexAMF: 06557364664B646B687364666E3334356B346A68736B64666873646B6633346B2C2C6D616E636F6173646332 44 bytes
true

ただし、一般に、AMF は 1 つのオブジェクト内の等号文字列の参照を使用するため、同じ文字列を 2 回書き込む場合は、AMF ( writeObject) と String ( )の結果のバイトのサイズに利点があります。writeUTF

package
{
import flash.display.Sprite;
import flash.utils.ByteArray;

public class astest extends Sprite
{
    public function astest()
    {
        var str:String = "sdfKdkhsdfn345k4jhskdfhsdkf34k,,mancoasdc2";

        var bytesUTF:ByteArray = new ByteArray();
        bytesUTF.writeUTF(str);
        bytesUTF.writeUTF(str);

        var bytesAMF:ByteArray = new ByteArray();
        bytesAMF.writeObject({str1:str, str2:str});

        var hexUTF:String = getHexBytesString(bytesUTF);
        var hexAMF:String = getHexBytesString(bytesAMF);
        trace("hexUTF:", hexUTF, bytesUTF.length, "bytes");
        trace("hexAMF:", hexAMF, bytesAMF.length, "bytes");

        trace(hexUTF.substr(4) == hexAMF.substr(4));

    }

    public static function getHexBytesString(array:ByteArray, colons:Boolean=false, position:int = 0):String {
        var s:String = "";
        var len:uint = array.length;
        for (var i:int=position;i<len;i++) {
            s+=("0"+array[i].toString(16)).substr(-2,2).toUpperCase();
            if (colons && i<array.length-1) s+= "-";
        }
        return s;
    }

}
}

出力:

hexUTF: 002A7364664B646B687364666E3334356B346A68736B64666873646B6633346B2C2C6D616E636F6173646332002A7364664B646B687364666E3334356B346A68736B64666873646B6633346B2C2C6D616E636F6173646332 88 bytes
hexAMF: 0A0B01097374723206557364664B646B687364666E3334356B346A68736B64666873646B6633346B2C2C6D616E636F61736463320973747231060201 60 bytes
false
于 2013-03-01T07:39:12.723 に答える