example/reader_writer.cc (58 lines of code) (raw):

#include <vector> #include <iostream> #include "hessian2/codec.hpp" #include "hessian2/basic_codec/object_codec.hpp" #include "hessian2/reader.hpp" #include "hessian2/writer.hpp" #include "absl/strings/string_view.h" struct Slice { const uint8_t* data_; size_t size_; }; class SliceReader : public ::Hessian2::Reader { public: SliceReader(Slice buffer) : buffer_(buffer){}; virtual ~SliceReader() = default; virtual void rawReadNBytes(void* out, size_t len, size_t peek_offset) override { ABSL_ASSERT(byteAvailable() + peek_offset >= len); uint8_t* dest = static_cast<uint8_t*>(out); // offset() Returns the current position that has been read. memcpy(dest, buffer_.data_ + offset() + peek_offset, len); } virtual uint64_t length() const override { return buffer_.size_; } private: Slice buffer_; }; class VectorWriter : public ::Hessian2::Writer { public: VectorWriter(std::vector<uint8_t>& data) : data_(data) {} ~VectorWriter() = default; virtual void rawWrite(const void* data, uint64_t size) { const char* src = static_cast<const char*>(data); for (size_t i = 0; i < size; i++) { data_.push_back(src[i]); } } virtual void rawWrite(absl::string_view data) { for (auto& ch : data) { data_.push_back(ch); } } private: std::vector<uint8_t>& data_; }; int main() { std::vector<uint8_t> data; auto writer = std::make_unique<VectorWriter>(data); ::Hessian2::Encoder encode(std::move(writer)); encode.encode<std::string>("test string"); Slice s{static_cast<const uint8_t*>(data.data()), data.size()}; auto reader = std::make_unique<SliceReader>(s); ::Hessian2::Decoder decode(std::move(reader)); auto ret = decode.decode<std::string>(); if (ret) { std::cout << *ret << std::endl; } else { std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl; } }