47
47
MAGIC_NUMBER = 0x62D4
48
48
DEFAULT_DYNAMIC_WRITE_META_STR_ID = - 1
49
49
DYNAMIC_TYPE_ID = - 1
50
- USE_CLASSNAME = 0
51
- USE_CLASS_ID = 1
52
- # preserve 0 as flag for class id not set in ClassInfo `
53
- NO_CLASS_ID = 0
54
- INT64_CLASS_ID = TypeId .INT64
55
- FLOAT64_CLASS_ID = TypeId .FLOAT64
56
- BOOL_CLASS_ID = TypeId .BOOL
57
- STRING_CLASS_ID = TypeId .STRING
58
- # `NOT_NULL_VALUE_FLAG` + `CLASS_ID << 1` in little-endian order
59
- NOT_NULL_INT64_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (INT64_CLASS_ID << 8 )
60
- NOT_NULL_FLOAT64_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (FLOAT64_CLASS_ID << 8 )
61
- NOT_NULL_BOOL_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (BOOL_CLASS_ID << 8 )
62
- NOT_NULL_STRING_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (STRING_CLASS_ID << 8 )
50
+ USE_TYPE_NAME = 0
51
+ USE_TYPE_ID = 1
52
+ # preserve 0 as flag for type id not set in TypeInfo `
53
+ NO_TYPE_ID = 0
54
+ INT64_TYPE_ID = TypeId .INT64
55
+ FLOAT64_TYPE_ID = TypeId .FLOAT64
56
+ BOOL_TYPE_ID = TypeId .BOOL
57
+ STRING_TYPE_ID = TypeId .STRING
58
+ # `NOT_NULL_VALUE_FLAG` + `TYPE_ID << 1` in little-endian order
59
+ NOT_NULL_INT64_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (INT64_TYPE_ID << 8 )
60
+ NOT_NULL_FLOAT64_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (FLOAT64_TYPE_ID << 8 )
61
+ NOT_NULL_BOOL_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (BOOL_TYPE_ID << 8 )
62
+ NOT_NULL_STRING_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (STRING_TYPE_ID << 8 )
63
63
SMALL_STRING_THRESHOLD = 16
64
64
65
65
@@ -100,9 +100,9 @@ class Fory:
100
100
"is_py" ,
101
101
"ref_tracking" ,
102
102
"ref_resolver" ,
103
- "class_resolver " ,
103
+ "type_resolver " ,
104
104
"serialization_context" ,
105
- "require_class_registration " ,
105
+ "require_type_registration " ,
106
106
"buffer" ,
107
107
"pickler" ,
108
108
"unpickler" ,
@@ -119,39 +119,39 @@ def __init__(
119
119
self ,
120
120
language = Language .XLANG ,
121
121
ref_tracking : bool = False ,
122
- require_class_registration : bool = True ,
122
+ require_type_registration : bool = True ,
123
123
):
124
124
"""
125
- :param require_class_registration :
126
- Whether to require registering classes for serialization, enabled by default.
127
- If disabled, unknown insecure classes can be deserialized, which can be
128
- insecure and cause remote code execution attack if the classes
125
+ :param require_type_registration :
126
+ Whether to require registering types for serialization, enabled by default.
127
+ If disabled, unknown insecure types can be deserialized, which can be
128
+ insecure and cause remote code execution attack if the types
129
129
`__new__`/`__init__`/`__eq__`/`__hash__` method contain malicious code.
130
- Do not disable class registration if you can't ensure your environment are
130
+ Do not disable type registration if you can't ensure your environment are
131
131
*indeed secure*. We are not responsible for security risks if
132
132
you disable this option.
133
133
"""
134
134
self .language = language
135
135
self .is_py = language == Language .PYTHON
136
- self .require_class_registration = (
137
- _ENABLE_CLASS_REGISTRATION_FORCIBLY or require_class_registration
136
+ self .require_type_registration = (
137
+ _ENABLE_TYPE_REGISTRATION_FORCIBLY or require_type_registration
138
138
)
139
139
self .ref_tracking = ref_tracking
140
140
if self .ref_tracking :
141
141
self .ref_resolver = MapRefResolver ()
142
142
else :
143
143
self .ref_resolver = NoRefResolver ()
144
144
from pyfory ._serialization import MetaStringResolver
145
- from pyfory ._registry import ClassResolver
145
+ from pyfory ._registry import TypeResolver
146
146
147
147
self .metastring_resolver = MetaStringResolver ()
148
- self .class_resolver = ClassResolver (self )
149
- self .class_resolver .initialize ()
148
+ self .type_resolver = TypeResolver (self )
149
+ self .type_resolver .initialize ()
150
150
self .serialization_context = SerializationContext ()
151
151
self .buffer = Buffer .allocate (32 )
152
- if not require_class_registration :
152
+ if not require_type_registration :
153
153
warnings .warn (
154
- "Class registration is disabled, unknown classes can be deserialized "
154
+ "Type registration is disabled, unknown types can be deserialized "
155
155
"which may be insecure." ,
156
156
RuntimeWarning ,
157
157
stacklevel = 2 ,
@@ -168,7 +168,7 @@ def __init__(
168
168
self ._peer_language = None
169
169
170
170
def register_serializer (self , cls : type , serializer ):
171
- self .class_resolver .register_serializer (cls , serializer )
171
+ self .type_resolver .register_serializer (cls , serializer )
172
172
173
173
# `Union[type, TypeVar]` is not supported in py3.6
174
174
def register_type (
@@ -180,7 +180,7 @@ def register_type(
180
180
typename : str = None ,
181
181
serializer = None ,
182
182
):
183
- return self .class_resolver .register_type (
183
+ return self .type_resolver .register_type (
184
184
cls ,
185
185
type_id = type_id ,
186
186
namespace = namespace ,
@@ -257,7 +257,7 @@ def _serialize(
257
257
else :
258
258
return buffer .to_bytes (0 , buffer .writer_index )
259
259
260
- def serialize_ref (self , buffer , obj , classinfo = None ):
260
+ def serialize_ref (self , buffer , obj , typeinfo = None ):
261
261
cls = type (obj )
262
262
if cls is str :
263
263
buffer .write_int16 (NOT_NULL_STRING_FLAG )
@@ -273,29 +273,29 @@ def serialize_ref(self, buffer, obj, classinfo=None):
273
273
return
274
274
if self .ref_resolver .write_ref_or_null (buffer , obj ):
275
275
return
276
- if classinfo is None :
277
- classinfo = self .class_resolver . get_classinfo (cls )
278
- self .class_resolver .write_typeinfo (buffer , classinfo )
279
- classinfo .serializer .write (buffer , obj )
276
+ if typeinfo is None :
277
+ typeinfo = self .type_resolver . get_typeinfo (cls )
278
+ self .type_resolver .write_typeinfo (buffer , typeinfo )
279
+ typeinfo .serializer .write (buffer , obj )
280
280
281
281
def serialize_nonref (self , buffer , obj ):
282
282
cls = type (obj )
283
283
if cls is str :
284
- buffer .write_varuint32 (STRING_CLASS_ID )
284
+ buffer .write_varuint32 (STRING_TYPE_ID )
285
285
buffer .write_string (obj )
286
286
return
287
287
elif cls is int :
288
- buffer .write_varuint32 (INT64_CLASS_ID )
288
+ buffer .write_varuint32 (INT64_TYPE_ID )
289
289
buffer .write_varint64 (obj )
290
290
return
291
291
elif cls is bool :
292
- buffer .write_varuint32 (BOOL_CLASS_ID )
292
+ buffer .write_varuint32 (BOOL_TYPE_ID )
293
293
buffer .write_bool (obj )
294
294
return
295
295
else :
296
- classinfo = self .class_resolver . get_classinfo (cls )
297
- self .class_resolver .write_typeinfo (buffer , classinfo )
298
- classinfo .serializer .write (buffer , obj )
296
+ typeinfo = self .type_resolver . get_typeinfo (cls )
297
+ self .type_resolver .write_typeinfo (buffer , typeinfo )
298
+ typeinfo .serializer .write (buffer , obj )
299
299
300
300
def xserialize_ref (self , buffer , obj , serializer = None ):
301
301
if serializer is None or serializer .need_to_write_ref :
@@ -313,9 +313,9 @@ def xserialize_nonref(self, buffer, obj, serializer=None):
313
313
serializer .xwrite (buffer , obj )
314
314
return
315
315
cls = type (obj )
316
- classinfo = self .class_resolver . get_classinfo (cls )
317
- self .class_resolver .write_typeinfo (buffer , classinfo )
318
- classinfo .serializer .xwrite (buffer , obj )
316
+ typeinfo = self .type_resolver . get_typeinfo (cls )
317
+ self .type_resolver .write_typeinfo (buffer , typeinfo )
318
+ typeinfo .serializer .xwrite (buffer , obj )
319
319
320
320
def deserialize (
321
321
self ,
@@ -381,17 +381,17 @@ def deserialize_ref(self, buffer):
381
381
ref_id = ref_resolver .try_preserve_ref_id (buffer )
382
382
# indicates that the object is first read.
383
383
if ref_id >= NOT_NULL_VALUE_FLAG :
384
- classinfo = self .class_resolver .read_typeinfo (buffer )
385
- o = classinfo .serializer .read (buffer )
384
+ typeinfo = self .type_resolver .read_typeinfo (buffer )
385
+ o = typeinfo .serializer .read (buffer )
386
386
ref_resolver .set_read_object (ref_id , o )
387
387
return o
388
388
else :
389
389
return ref_resolver .get_read_object ()
390
390
391
391
def deserialize_nonref (self , buffer ):
392
392
"""Deserialize not-null and non-reference object from buffer."""
393
- classinfo = self .class_resolver .read_typeinfo (buffer )
394
- return classinfo .serializer .read (buffer )
393
+ typeinfo = self .type_resolver .read_typeinfo (buffer )
394
+ return typeinfo .serializer .read (buffer )
395
395
396
396
def xdeserialize_ref (self , buffer , serializer = None ):
397
397
if serializer is None or serializer .need_to_write_ref :
@@ -411,7 +411,7 @@ def xdeserialize_ref(self, buffer, serializer=None):
411
411
412
412
def xdeserialize_nonref (self , buffer , serializer = None ):
413
413
if serializer is None :
414
- serializer = self .class_resolver .read_typeinfo (buffer ).serializer
414
+ serializer = self .type_resolver .read_typeinfo (buffer ).serializer
415
415
return serializer .xread (buffer )
416
416
417
417
def write_buffer_object (self , buffer , buffer_object : BufferObject ):
@@ -457,20 +457,20 @@ def handle_unsupported_read(self, buffer):
457
457
assert self ._unsupported_objects is not None
458
458
return next (self ._unsupported_objects )
459
459
460
- def write_ref_pyobject (self , buffer , value , classinfo = None ):
460
+ def write_ref_pyobject (self , buffer , value , typeinfo = None ):
461
461
if self .ref_resolver .write_ref_or_null (buffer , value ):
462
462
return
463
- if classinfo is None :
464
- classinfo = self .class_resolver . get_classinfo (type (value ))
465
- self .class_resolver .write_typeinfo (buffer , classinfo )
466
- classinfo .serializer .write (buffer , value )
463
+ if typeinfo is None :
464
+ typeinfo = self .type_resolver . get_typeinfo (type (value ))
465
+ self .type_resolver .write_typeinfo (buffer , typeinfo )
466
+ typeinfo .serializer .write (buffer , value )
467
467
468
468
def read_ref_pyobject (self , buffer ):
469
469
return self .deserialize_ref (buffer )
470
470
471
471
def reset_write (self ):
472
472
self .ref_resolver .reset_write ()
473
- self .class_resolver .reset_write ()
473
+ self .type_resolver .reset_write ()
474
474
self .serialization_context .reset ()
475
475
self .metastring_resolver .reset_write ()
476
476
self .pickler .clear_memo ()
@@ -479,7 +479,7 @@ def reset_write(self):
479
479
480
480
def reset_read (self ):
481
481
self .ref_resolver .reset_read ()
482
- self .class_resolver .reset_read ()
482
+ self .type_resolver .reset_read ()
483
483
self .serialization_context .reset ()
484
484
self .metastring_resolver .reset_write ()
485
485
self .unpickler = None
@@ -521,8 +521,8 @@ def reset(self):
521
521
self .objects .clear ()
522
522
523
523
524
- _ENABLE_CLASS_REGISTRATION_FORCIBLY = os .getenv (
525
- "ENABLE_CLASS_REGISTRATION_FORCIBLY " , "0"
524
+ _ENABLE_TYPE_REGISTRATION_FORCIBLY = os .getenv (
525
+ "ENABLE_TYPE_REGISTRATION_FORCIBLY " , "0"
526
526
) in {
527
527
"1" ,
528
528
"true" ,
@@ -532,9 +532,9 @@ def reset(self):
532
532
class _PicklerStub :
533
533
def dump (self , o ):
534
534
raise ValueError (
535
- f"Class { type (o )} is not registered, "
536
- f"pickle is not allowed when class registration enabled, Please register"
537
- f"the class or pass unsupported_callback"
535
+ f"Type { type (o )} is not registered, "
536
+ f"pickle is not allowed when type registration enabled, Please register"
537
+ f"the type or pass unsupported_callback"
538
538
)
539
539
540
540
def clear_memo (self ):
@@ -544,6 +544,6 @@ def clear_memo(self):
544
544
class _UnpicklerStub :
545
545
def load (self ):
546
546
raise ValueError (
547
- "pickle is not allowed when class registration enabled, Please register"
548
- "the class or pass unsupported_callback"
547
+ "pickle is not allowed when type registration enabled, Please register"
548
+ "the type or pass unsupported_callback"
549
549
)
0 commit comments