2
2
namespace AMF ;
3
3
4
4
use AMF \Exception \NotSupportedException ;
5
+ use AMF \Exception \SerializationException ;
5
6
use DateTime ;
6
7
use Exception ;
7
8
use SimpleXMLElement ;
@@ -59,6 +60,10 @@ public static function serialize($data, $includeType = true)
59
60
self ::serializeDate ($ data , $ includeType );
60
61
break ;
61
62
63
+ case ($ data instanceof ByteArray):
64
+ self ::serializeByteArray ($ data , $ includeType );
65
+ break ;
66
+
62
67
case is_array ($ data ):
63
68
self ::serializeArray ($ data , $ includeType );
64
69
break ;
@@ -194,17 +199,18 @@ private static function serializeArray($data)
194
199
195
200
$ isDense = Spec::isDenseArray ($ data );
196
201
if ($ isDense ) {
197
- self ::serializeInt ((count ($ data ) << 1 ) | 0x01 , false );
202
+ self ::serializeInt ((count ($ data ) << 1 ) | Spec:: REFERENCE_BIT , false );
198
203
self ::serializeString ('' , false );
199
204
200
205
foreach ($ data as $ element ) {
201
206
self ::serialize ($ element );
202
207
}
208
+
203
209
} else {
204
210
self ::serializeInt (1 , false );
205
211
206
212
foreach ($ data as $ key => $ value ) {
207
- self ::serializeString ((string ) $ key , false );
213
+ self ::serializeString ((string ) $ key , false , false );
208
214
self ::serialize ($ value );
209
215
}
210
216
@@ -240,23 +246,24 @@ private static function serializeObject($data)
240
246
}
241
247
242
248
// write object info & class name
243
- self ::serializeInt (($ numProperties << 0x04 ) | ((int ) $ externalizable << 0x02 ) | 0x03 , false );
244
- self ::serializeString (self ::getObjectClassname ($ data ), false );
249
+ if ($ dynamic ) {
250
+ self ::serializeInt (0x0b , false );
251
+ } else {
252
+ self ::serializeInt (($ numProperties << 0x04 ) | ((int ) $ externalizable << 0x02 ) | 0x03 , false );
253
+ }
254
+
255
+ self ::serializeString (self ::getObjectClassname ($ data ), false , false );
245
256
246
257
if ($ dynamic ) {
247
258
248
259
// write keys
249
260
foreach ($ properties as $ key => $ value ) {
250
261
self ::serializeString ($ key , false , false );
251
- }
252
-
253
- // write values
254
- foreach ($ properties as $ key => $ value ) {
255
262
self ::serialize ($ value );
256
263
}
257
264
258
265
// close
259
- self ::serializeInt (0x01 , false );
266
+ self ::serializeInt (Spec:: REFERENCE_BIT , false );
260
267
} else {
261
268
262
269
/**
@@ -269,6 +276,20 @@ private static function serializeObject($data)
269
276
}
270
277
}
271
278
279
+ private static function serializeByteArray ($ data , $ includeType = true )
280
+ {
281
+ if ($ includeType ) {
282
+ self ::writeBytes (Spec::TYPE_BYTE_ARRAY );
283
+ }
284
+
285
+ if (!$ data instanceof ByteArray) {
286
+ throw new SerializationException ('Invalid ByteArray data provided ' );
287
+ }
288
+
289
+ self ::serializeInt (strlen ($ data ->getData ()) << 1 | Spec::REFERENCE_BIT , false );
290
+ self ::writeBytes ($ data ->getData (), true );
291
+ }
292
+
272
293
private static function writeBytes ($ bytes , $ raw = false )
273
294
{
274
295
self ::$ packet .= $ raw ? $ bytes : pack ('c ' , $ bytes );
0 commit comments