@@ -102,18 +102,17 @@ def __new__(
102102 mcs , name , (GenericObjectProps , )+ base_classes , namespace
103103 )
104104
105- def _build (self , client : 'Client' = None ) -> int :
105+ def _from_python (self , stream , save_to_buf = False ) :
106106 """
107107 Method for building binary representation of the Generic object
108108 and calculating a hashcode from it.
109109
110110 :param self: Generic object instance,
111- :param client: (optional) connection to GridGain cluster,
111+ :param stream: BinaryStream
112+ :param save_to_buf: Optional. If True, save serialized data to buffer.
112113 """
113- if client is None :
114- compact_footer = True
115- else :
116- compact_footer = client .compact_footer
114+
115+ compact_footer = stream .compact_footer
117116
118117 # prepare header
119118 header_class = BinaryObject .build_header ()
@@ -129,18 +128,19 @@ def _build(self, client: 'Client' = None) -> int:
129128 header .type_id = self .type_id
130129 header .schema_id = self .schema_id
131130
131+ header_len = ctypes .sizeof (header_class )
132+ initial_pos = stream .tell ()
133+
132134 # create fields and calculate offsets
133135 offsets = [ctypes .sizeof (header_class )]
134- field_buffer = bytearray ()
135136 schema_items = list (self .schema .items ())
137+
138+ stream .seek (initial_pos + header_len )
136139 for field_name , field_type in schema_items :
137- partial_buffer = field_type .from_python (
138- getattr (
139- self , field_name , getattr (field_type , 'default' , None )
140- )
141- )
142- offsets .append (max (offsets ) + len (partial_buffer ))
143- field_buffer += partial_buffer
140+ val = getattr (self , field_name , getattr (field_type , 'default' , None ))
141+ field_start_pos = stream .tell ()
142+ field_type .from_python (stream , val )
143+ offsets .append (max (offsets ) + stream .tell () - field_start_pos )
144144
145145 offsets = offsets [:- 1 ]
146146
@@ -160,15 +160,18 @@ def _build(self, client: 'Client' = None) -> int:
160160 schema [i ].offset = offset
161161
162162 # calculate size and hash code
163- header .schema_offset = (
164- ctypes .sizeof (header_class )
165- + len (field_buffer )
166- )
163+ fields_data_len = stream .tell () - initial_pos - header_len
164+ header .schema_offset = fields_data_len + header_len
167165 header .length = header .schema_offset + ctypes .sizeof (schema_class )
168- header .hash_code = hashcode (field_buffer )
166+ header .hash_code = stream .hashcode (initial_pos + header_len , fields_data_len )
167+
168+ stream .seek (initial_pos )
169+ stream .write (header )
170+ stream .seek (initial_pos + header .schema_offset )
171+ stream .write (schema )
169172
170- # reuse the results
171- self ._buffer = bytes (header ) + field_buffer + bytes ( schema )
173+ if save_to_buf :
174+ self ._buffer = bytes (stream . mem_view ( initial_pos , stream . tell () - initial_pos ) )
172175 self ._hashcode = header .hash_code
173176
174177 def _setattr (self , attr_name : str , attr_value : Any ):
@@ -180,7 +183,7 @@ def _setattr(self, attr_name: str, attr_value: Any):
180183 # `super()` is really need these parameters
181184 super (result , self ).__setattr__ (attr_name , attr_value )
182185
183- setattr (result , _build .__name__ , _build )
186+ setattr (result , _from_python .__name__ , _from_python )
184187 setattr (result , '__setattr__' , _setattr )
185188 setattr (result , '_buffer' , None )
186189 setattr (result , '_hashcode' , None )
0 commit comments