def Runtime_Deserialize(self, engine: ExecutionEngine): data = engine.CurrentContext.EvaluationStack.Pop().GetByteArray() ms = StreamManager.GetStream(data=data) reader = BinaryReader(ms) try: stack_item = StackItem.DeserializeStackItem(reader) engine.CurrentContext.EvaluationStack.PushT(stack_item) except Exception as e: logger.error("Could not Deserialize stack item: %s " % e) return False return True
def Runtime_Deserialize(self, engine: ExecutionEngine): data = engine.CurrentContext.EvaluationStack.Pop().GetByteArray() ms = StreamManager.GetStream(data=data) reader = BinaryReader(ms) try: stack_item = StackItem.DeserializeStackItem(reader) engine.CurrentContext.EvaluationStack.PushT(stack_item) except ValueError as e: # can't deserialize type return False finally: StreamManager.ReleaseStream(ms) return True
def test_serialization_2(self): output = Compiler.instance().load( '%s/boa_test/example/demo/SerializationTest.py' % TestContract.dirname).default out = output.write() tx, results, total_ops, engine = TestBuild(out, [2], self.GetWallet1(), '02', '05') self.assertEqual(len(results), 1) self.assertEqual( results[0].GetByteArray(), bytearray( b'\x80\x05\x00\x01a\x02\x01\x03\x80\x03\x00\x01j\x02\x01\x03\x02\x01\x05\x00\x02jk\x00\x07lmnopqr' )) stream = StreamManager.GetStream(results[0].GetByteArray()) reader = BinaryReader(stream) stack_item = StackItem.DeserializeStackItem(reader) self.assertIsInstance(stack_item, Array) self.assertEqual(stack_item.Count, 5) self.assertEqual(stack_item.GetArray()[-1].GetString(), 'lmnopqr')
def test_serialize_integer(self): # create integer, serialize it via state reader my_integer = StackItem.New(1234) self.engine.EvaluationStack.PushT(my_integer) self.state_reader.Runtime_Serialize(self.engine) self.assertEqual(len(self.engine.EvaluationStack.Items), 1) # we will preview what will be pushed onto the stack existing = self.engine.EvaluationStack.Peek(0) ms = StreamManager.GetStream(existing.GetByteArray()) reader = BinaryReader(ms) result = StackItem.DeserializeStackItem(reader) # now run deserialized res = self.state_reader.Runtime_Deserialize(self.engine) self.assertEqual(res, True) deserialized = self.engine.EvaluationStack.Pop() self.assertEqual(deserialized, result) self.assertEqual(deserialized, my_integer) self.assertEqual(deserialized.GetBigInteger(), 1234)