BsMemorySerializer.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "BsMemorySerializer.h"
  2. #include "BsException.h"
  3. #include "BsIReflectable.h"
  4. #include "BsBinarySerializer.h"
  5. using namespace std::placeholders;
  6. namespace BansheeEngine
  7. {
  8. MemorySerializer::MemorySerializer()
  9. { }
  10. MemorySerializer::~MemorySerializer()
  11. { }
  12. UINT8* MemorySerializer::encode(IReflectable* object, UINT32& bytesWritten,
  13. std::function<void*(UINT32)> allocator, bool shallow)
  14. {
  15. using namespace std::placeholders;
  16. BinarySerializer bs;
  17. BufferPiece piece;
  18. piece.buffer = (UINT8*)bs_alloc(WRITE_BUFFER_SIZE);
  19. piece.size = 0;
  20. mBufferPieces.push_back(piece);
  21. bs.encode(object, piece.buffer, WRITE_BUFFER_SIZE, &bytesWritten,
  22. std::bind(&MemorySerializer::flushBuffer, this, _1, _2, _3), shallow);
  23. UINT8* resultBuffer;
  24. if(allocator != nullptr)
  25. resultBuffer = (UINT8*)allocator(bytesWritten);
  26. else
  27. resultBuffer = (UINT8*)bs_alloc(bytesWritten);
  28. UINT32 offset = 0;
  29. for(auto iter = mBufferPieces.begin(); iter != mBufferPieces.end(); ++iter)
  30. {
  31. if(iter->size > 0)
  32. {
  33. memcpy(resultBuffer + offset, iter->buffer, iter->size);
  34. offset += iter->size;
  35. }
  36. }
  37. for(auto iter = mBufferPieces.rbegin(); iter != mBufferPieces.rend(); ++iter)
  38. {
  39. bs_free(iter->buffer);
  40. }
  41. mBufferPieces.clear();
  42. return resultBuffer;
  43. }
  44. std::shared_ptr<IReflectable> MemorySerializer::decode(UINT8* buffer, UINT32 bufferSize)
  45. {
  46. BinarySerializer bs;
  47. std::shared_ptr<IReflectable> object = bs.decode(buffer, (UINT32)bufferSize);
  48. return object;
  49. }
  50. UINT8* MemorySerializer::flushBuffer(UINT8* bufferStart, UINT32 bytesWritten, UINT32& newBufferSize)
  51. {
  52. mBufferPieces.back().size = bytesWritten;
  53. BufferPiece piece;
  54. piece.buffer = (UINT8*)bs_alloc(WRITE_BUFFER_SIZE);
  55. piece.size = 0;
  56. mBufferPieces.push_back(piece);
  57. return piece.buffer;
  58. }
  59. }