2
0

CmMemorySerializer.cpp 1.8 KB

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