AMF序列化技巧

2022-04-10 06:33:54 字數 2155 閱讀 2676

amf主要是在儲存配置上很牛,但是還有很多小技巧可以讓它更好。今天此文就是告訴你如何自定義物件的序列化和解序列化來讓檔案更小並且獲得最大的控制。

amf格式產生的檔案比json和xml格式的都要小的多,但它主要不是因為減小檔案大小而出名。amf在一般物件上處理的還是不錯的,但是很多情況我們需要關於特殊物件的具體資訊。例如:乙個元素的類element。

1

class

element

2

很不幸的是as3不允許我們使用小整型, 32位足夠元素數量的範圍(0-119)。即使考慮新發現的元素,乙個位元組就可以處理0-255的範圍並提供足夠的增長空間。

雖然as3不提供小整型,我們可以在bytearray或者idataoutput裡儲存小的整數值。我們可以使用任何類來實現flash.utiles.iexternalizable介面和自定義任何類的序列化。我們不需要依賴amf預設的序列化操作,相反我們可以提供乙個public function writeexternal(out:idataoutput):void函式來寫入任何資料,乙個public function readexternal(in:idatainput):void函式來讀入任何需要解序列化的資料。

這樣我們就有乙個很方便的方式來自定義任何類的序列化格式並仍然可以使用amf的bytearray.writeobject/readobject。當然我們不需要自定義所有的類,只定義我們選擇的即可。而你的類的大小跟預設amf格式的也差不多,但是當你想優化的時候只需要自定義乙個或兩個需要的類即可。

在element類中,我們自定義了方式,這樣只會在序列化元素數值這少量的位元組。

1

class elementiebyte implements

iexternalizable211

12public

function readexternal(input:idatainput): void

1317 }

理論上這可以為每個序列化的element節省三個位元組。來測試下,然後在另乙個版本裡使用iexternalizable並寫全32為的整型值。

1

package215

16public

function

testiexternalizable()

1787}88

}89import

flash.utils.idatainput;

90import

flash.utils.idataoutput;

91import

flash.utils.iexternalizable;

9293

class

element

9498

99class elementieint implements

iexternalizable

100109

110public

function readexternal(input:idatainput): void

111115

}116

117class elementiebyte implements

iexternalizable

118127

128public

function readexternal(input:idatainput): void

129133 }

在最後通過時所有的解序列化都會檢查。下面是大小的比較結果:

很明顯,不使用預設的amf序列化,直接寫idataoutput本身可以提供更小的檔案大小。上圖中,最後乙個版本中使用位元組而不是int,我們可以看到就像理論上**的一樣,我們介紹了額外的三個位元組。

總結下,如果你使用amf來序列化類物件,並且想縮小檔案大小,可以考慮使用iexternalizable來自定義序列化和解序列化處理過程。

AMF序列化為物件和AMF序列化為二進位制位元組流

在使用flex作為頁面前端驅動socket通訊時,一般使用amf格式來進行的傳送和接收,因此就要涉及到不同的資料格式的轉換。下面提供了amf序列化為物件和amf序列化為二進位制位元組流的方法,如下 將amf格式位元組流轉換為物件 public static t amf deserializer by...

AMF序列化為物件和AMF序列化為二進位制位元組流

在使用flex作為頁面前端驅動socket通訊時,一般使用amf格式來進行的傳送和接收,因此就要涉及到不同的資料格式的轉換。下面提供了amf序列化為物件和amf序列化為二進位制位元組流的方法,如下 將amf格式位元組流轉換為物件 public static t amf deserializer by...

AMF序列化為物件和AMF序列化為二進位制位元組流

在使用flex作為頁面前端驅動socket通訊時,一般使用amf格式來進行的傳送和接收,因此就要涉及到不同的資料格式的轉換。下面提供了amf序列化為物件和amf序列化為二進位制位元組流的方法,如下 將amf格式位元組流轉換為物件 public static t amf deserializer by...