@@ -133,7 +133,7 @@ class BinaryBuffer {
133
133
return buffer ;
134
134
}
135
135
136
- public checkBufferExten ( appendSize :number = 8 ) {
136
+ public checkBufferExpand ( appendSize :number = 8 ) {
137
137
let cursize = this . m_arrayBufferCurrentSize ;
138
138
if ( this . m_pos + appendSize >= cursize ) {
139
139
let tarsize = cursize + appendSize ;
@@ -166,7 +166,9 @@ class BinaryBuffer {
166
166
this . writeType ( type ) ;
167
167
let f :( v :any ) => void = this [ BinaryBuffer . WriteFuncMap [ type ] ] ;
168
168
let isobj = type == DataType . Object ;
169
+
169
170
if ( ! isary ) {
171
+ this . checkBufferExpand ( 8 ) ;
170
172
isobj ? f . call ( this , val , tmc ) : f . call ( this , val ) ;
171
173
return ;
172
174
}
@@ -175,15 +177,11 @@ class BinaryBuffer {
175
177
throw new Error ( msg ) ;
176
178
}
177
179
let ary = < Array < any > > val ;
178
-
179
180
let arylen = ary . length ;
180
-
181
- if ( type != DataType . Object && type != DataType . String ) {
182
- this . checkBufferExten ( arylen * 8 + 4 ) ;
183
- }
184
- else {
185
- this . checkBufferExten ( 4 ) ;
181
+ if ( arylen > 65535 ) {
182
+ throw new Error ( 'array length exceeded.' ) ;
186
183
}
184
+ this . checkBufferExpand ( arylen * 8 + 4 ) ;
187
185
this . writeUint16 ( arylen ) ;
188
186
if ( isobj ) {
189
187
for ( let i = 0 ; i < arylen ; i ++ ) {
@@ -252,7 +250,13 @@ class BinaryBuffer {
252
250
public writeFloat64 ( v : number ) {
253
251
let view = this . m_view ;
254
252
let p = this . m_pos ;
255
- view . setFloat64 ( p , v ) ;
253
+ try {
254
+ view . setFloat64 ( p , v ) ;
255
+ }
256
+ catch ( e ) {
257
+ console . log ( p , this . m_arrayBufferCurrentSize ) ;
258
+ throw e ;
259
+ }
256
260
this . m_pos += 8 ;
257
261
}
258
262
public readFloat64 ( ) : number {
@@ -360,7 +364,7 @@ class BinaryBuffer {
360
364
if ( len >= 65535 )
361
365
throw new Error ( 'string length exceed!' ) ;
362
366
this . writeUint16 ( len ) ;
363
- this . checkBufferExten ( len ) ;
367
+ this . checkBufferExpand ( len ) ;
364
368
let buf = this . m_arrayBuffer ;
365
369
buf . set ( ary , this . m_pos ) ;
366
370
this . m_pos += len ;
@@ -387,77 +391,39 @@ class BinaryBuffer {
387
391
}
388
392
389
393
public writeObject ( o :any , tmc :TypeMetaClass ) {
390
- if ( o == null ) {
391
- this . writeUint32 ( 0 ) ;
392
- return ;
393
- }
394
- let buffer = BinarySeralizer . serialize ( tmc , o ) ;
395
- let len = buffer . byteLength ;
396
- this . checkBufferExten ( len + 8 ) ;
397
- this . writeUint32 ( len ) ;
398
- this . m_arrayBuffer . set ( new Uint8Array ( buffer , 0 , len ) , this . m_pos ) ;
399
- this . m_pos += len ;
394
+ this . serialize ( tmc , o ) ;
400
395
}
401
396
402
397
public readObject ( tmc :TypeMetaClass ) {
403
- let len = this . readUint32 ( ) ;
404
- if ( len == 0 ) return null ;
405
- let pos = this . m_pos ;
406
- let arybuffer = this . m_arrayBuffer . buffer . slice ( pos , pos + len ) ;
407
- let ret = BinarySeralizer . deserializeWidthMeta ( tmc , arybuffer , 0 , len ) ;
408
- this . m_pos += len ;
409
- return ret ;
398
+ let tar = Object . create ( tmc . prototype ) ;
399
+ this . deserialize ( tar , tmc ) ;
400
+ return tar ;
410
401
}
411
- }
412
- BinaryBuffer . initialize ( ) ;
413
402
414
-
415
- class BinarySeralizer {
416
- public static serialize < T > ( mc : TypeMetaClass , obj : T ) :ArrayBuffer {
403
+ public serialize < T > ( mc :TypeMetaClass , obj :T ) {
417
404
let properties = mc . properties ;
418
-
419
- let binarybuffer = BinaryBuffer . create ( ) ;
420
405
for ( let i = 0 , len = properties . length ; i < len ; i ++ ) {
421
406
let p = properties [ i ] ;
422
- binarybuffer . pushProperty ( p . datatype , obj [ p . key ] , p . isArray , p . pclass ) ;
407
+ this . pushProperty ( p . datatype , obj [ p . key ] , p . isArray , p . pclass ) ;
423
408
}
424
- return binarybuffer . m_arrayBuffer . buffer . slice ( 0 , binarybuffer . pos ) ;
425
409
}
426
410
427
- public static deserialize < T > ( tar :T , mc :TypeMetaClass , buffer : ArrayBuffer ) :T | null {
411
+ public deserialize < T > ( tar :T , mc :TypeMetaClass ) :T | null {
428
412
if ( mc == null ) {
429
413
throw new Error ( 'typeMetaClass is null' ) ;
430
414
}
431
415
mc . sortProperty ( ) ;
432
416
433
417
let properties = mc . properties ;
434
- let binarybuffer = BinaryBuffer . createWithView ( buffer , 0 , buffer . byteLength ) ;
435
418
for ( let i = 0 , len = properties . length ; i < len ; i ++ ) {
436
419
let p = properties [ i ] ;
437
- var val = binarybuffer . readProperty ( p . datatype , p . isArray , p . pclass ) ;
438
- tar [ p . key ] = val ;
439
- }
440
- return tar ;
441
- }
442
-
443
- public static deserializeWidthMeta ( mc :TypeMetaClass , buffer :ArrayBuffer , offset :number , size :number ) : any | null {
444
- if ( mc == null ) {
445
- throw new Error ( 'typeMetaClass is null' ) ;
446
- }
447
- mc . sortProperty ( ) ;
448
-
449
- let properties = mc . properties ;
450
- let proto = mc . prototype ;
451
- let tar = Object . create ( proto ) ;
452
- let binarybuffer = BinaryBuffer . createWithView ( buffer , offset , size ) ;
453
- for ( let i = 0 , len = properties . length ; i < len ; i ++ ) {
454
- let p = properties [ i ] ;
455
- var val = binarybuffer . readProperty ( p . datatype , p . isArray , p . pclass ) ;
420
+ var val = this . readProperty ( p . datatype , p . isArray , p . pclass ) ;
456
421
tar [ p . key ] = val ;
457
422
}
458
423
return tar ;
459
424
}
460
425
}
426
+ BinaryBuffer . initialize ( ) ;
461
427
462
428
export function BinarySerialize < T > ( obj : T , type ?:{ new ( ) :T } ) :ArrayBuffer {
463
429
let p = Object . getPrototypeOf ( obj ) ;
@@ -474,7 +440,10 @@ export function BinarySerialize < T > (obj : T,type?:{new():T}):ArrayBuffer{
474
440
throw new Error ( msg ) ;
475
441
}
476
442
mc . sortProperty ( ) ;
477
- return BinarySeralizer . serialize ( mc , obj ) ;
443
+
444
+ let binarybuffer = BinaryBuffer . create ( ) ;
445
+ binarybuffer . serialize ( mc , obj ) ;
446
+ return binarybuffer . m_arrayBuffer . buffer . slice ( 0 , binarybuffer . pos ) ;
478
447
}
479
448
480
449
export function BinaryDeserialize < T > ( type :{ new ( ) :T } , databuffer :ArrayBuffer ) : T | null {
@@ -483,6 +452,7 @@ export function BinaryDeserialize<T>(type:{new():T},databuffer:ArrayBuffer): T |
483
452
let mc = TypeReflector . getMetaClass ( p ) ;
484
453
if ( mc == null ) throw new Error ( `reflect class ${ p } invalid.` ) ;
485
454
mc . sortProperty ( ) ;
486
- return BinarySeralizer . deserialize ( obj , mc , databuffer ) ;
487
455
456
+ let binarybuffer = BinaryBuffer . createWithView ( databuffer , 0 , databuffer . byteLength ) ;
457
+ return binarybuffer . deserialize ( obj , mc ) ;
488
458
}
0 commit comments