hessian2-codec

CILicenseCoverage

hessian2-codec is a C++ library from Alibaba for hessian2 codec. It is a complete C++ implementation of hessian2 spec. Because it was originally intended to implement the Dubbo Filter of Envoy, it did not provide good support for serialization of user-defined types (there is only one way to implement user-defined types using ADL, but it is not very complete and does not support nested types well). At the moment it is simply deserializing content into some C++ intermediate types.

Getting Started

Install

  1. To download and install Bazel (and any of its dependencies), consult the Bazel Installation Guide.
  2. Refer to Supported Platforms installation related compiler.
  3. Use hessian2-codec, see the demo directory for details.
$ cd demo
$ bazel build //...
$ ./bazel-bin/demo

Basic usage

#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"intmain() {
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<std::string>("test string");
::Hessian2::Decoder decode(out);
auto ret = decode.decode<std::string>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<int64_t>(100);
::Hessian2::Decoder decode(out);
auto ret = decode.decode<int64_t>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
return0;
}

Advance usage

  1. Implement the serialization and deserialization of custom types with ADL
#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"structPerson {
int32_t age_{0};
std::string name_;
};
// The custom struct needs to implement from_hessian and to_hessian methods to// encode and decodevoidfromHessian(Person&, ::Hessian2::Decoder&);
booltoHessian(const Person&, ::Hessian2::Encoder&);
voidfromHessian(Person& p, ::Hessian2::Decoder& d) {
auto age = d.decode<int32_t>();
if (age) {
p.age_ = *age;
}
auto name = d.decode<std::string>();
if (name) {
p.name_ = *name;
}
}
booltoHessian(const Person& p, ::Hessian2::Encoder& e) {
e.encode<int32_t>(p.age_);
e.encode<std::string>(p.name_);
returntrue;
}
intmain() {
std::string out;
Hessian2::Encoder encode(out);
Person s;
s.age_ = 12;
s.name_ = "test";
encode.encode<Person>(s);
Hessian2::Decoder decode(out);
auto decode_person = decode.decode<Person>();
if (!decode_person) {
std::cerr << "hessian decode failed " << decode.getErrorMessage()
<< std::endl;
return -1;
}
std::cout << "Age: " << decode_person->age_
<< " Name: " << decode_person->name_ << std::endl;
}

There is currently no way to serialize container nested custom types such asstd::list<Person>.

  1. Customize Reader and Writer

Hessian2-codec uses the std::string implementation of reader and Writer by default, although we can customize both implementations.

#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"structSlice {
constuint8_t* data_;
size_t size_;
};
classSliceReader : public ::Hessian2::Reader {
public:SliceReader(Slice buffer) : buffer_(buffer){};
virtual~SliceReader() = default;
virtualvoidrawReadNBytes(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);
}
virtualuint64_tlength() constoverride { return buffer_.size_; }
private:
Slice buffer_;
};
classVectorWriter : public ::Hessian2::Writer {
public:VectorWriter(std::vector<uint8_t>& data) : data_(data) {}
~VectorWriter() = default;
virtualvoidrawWrite(constvoid* data, uint64_t size) {
constchar* src = static_cast<constchar*>(data);
for (size_t i = 0; i < size; i++) {
data_.push_back(src[i]);
}
}
virtualvoidrawWrite(absl::string_view data) {
for (auto& ch : data) {
data_.push_back(ch);
}
}
private:
std::vector<uint8_t>& data_;
};
intmain() {
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<constuint8_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;
}
}

Type mapping

C++ does not have a global parent like Java Object, so there is no single type that can represent all hessian types, so we create an Object base class from which all hessian types are inherited.

hessian typejava typeC++ type
nullnullNullObject
binarybyte[]BinaryObject
booleanbooleanBooleanObject
datejava.util.DateDateObject
doubledoubleDoubleObject
intintIntegerObject
longlongLongObject
stringjava.lang.StringStringObject
untyped listjava.util.ListUntypedListObject
typed listjava.util.ArrayListTypedListObject
untyped mapjava.util.MapUntypedMapObject
typed mapfor some OO languageTypedMapObject
objectcustom define objectClassInstance

Supported Platforms

hessian2-codec requires a codebase and compiler compliant with the C++14 standard or newer.

The hessian2-codec code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered.

If you notice any problems on your platform, please file an issue on the hessian2-codec GitHub Issue Tracker. Pull requests containing fixes are welcome!

Operating Systems

  • Linux
  • macOS
  • Windows(Theoretically, yes, but I haven't tested it.)

Compilers

  • gcc 7.0+
  • clang 7.0+

Build Systems

Who Is Using hessian2-codec?

In addition to many internal projects at Alibaba, hessian2-codec is also used by the following notable projects:

  • The Envoy (Dubbo Filter in Envoy will use hessian2-codec as the serializer).

Related Open Source Projects

Contributing

Please read CONTRIBUTING.md for details on how to contribute to this project.

Happy testing!

Develop

Generate compile_commands.json for this repo by bazel run :refresh_compile_commands. Thank https://github.com/hedronvision/bazel-compile-commands-extractor for it provide the great script/tool to make this so easy!

License

hessian2-codec is distributed under Apache License 2.0.

Acknowledgements

About

hessian2-codec it is a complete C++ implementation of hessian2 spec

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

30 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

hessian2-codec

CILicenseCoverage

hessian2-codec is a C++ library from Alibaba for hessian2 codec. It is a complete C++ implementation of hessian2 spec. Because it was originally intended to implement the Dubbo Filter of Envoy, it did not provide good support for serialization of user-defined types (there is only one way to implement user-defined types using ADL, but it is not very complete and does not support nested types well). At the moment it is simply deserializing content into some C++ intermediate types.

Getting Started

Install

  1. To download and install Bazel (and any of its dependencies), consult the Bazel Installation Guide.
  2. Refer to Supported Platforms installation related compiler.
  3. Use hessian2-codec, see the demo directory for details.
$ cd demo
$ bazel build //...
$ ./bazel-bin/demo

Basic usage

#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"intmain() {
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<std::string>("test string");
::Hessian2::Decoder decode(out);
auto ret = decode.decode<std::string>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<int64_t>(100);
::Hessian2::Decoder decode(out);
auto ret = decode.decode<int64_t>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
return0;
}

Advance usage

  1. Implement the serialization and deserialization of custom types with ADL
#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"structPerson {
int32_t age_{0};
std::string name_;
};
// The custom struct needs to implement from_hessian and to_hessian methods to// encode and decodevoidfromHessian(Person&, ::Hessian2::Decoder&);
booltoHessian(const Person&, ::Hessian2::Encoder&);
voidfromHessian(Person& p, ::Hessian2::Decoder& d) {
auto age = d.decode<int32_t>();
if (age) {
p.age_ = *age;
}
auto name = d.decode<std::string>();
if (name) {
p.name_ = *name;
}
}
booltoHessian(const Person& p, ::Hessian2::Encoder& e) {
e.encode<int32_t>(p.age_);
e.encode<std::string>(p.name_);
returntrue;
}
intmain() {
std::string out;
Hessian2::Encoder encode(out);
Person s;
s.age_ = 12;
s.name_ = "test";
encode.encode<Person>(s);
Hessian2::Decoder decode(out);
auto decode_person = decode.decode<Person>();
if (!decode_person) {
std::cerr << "hessian decode failed " << decode.getErrorMessage()
<< std::endl;
return -1;
}
std::cout << "Age: " << decode_person->age_
<< " Name: " << decode_person->name_ << std::endl;
}

There is currently no way to serialize container nested custom types such asstd::list<Person>.

  1. Customize Reader and Writer

Hessian2-codec uses the std::string implementation of reader and Writer by default, although we can customize both implementations.

#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"structSlice {
constuint8_t* data_;
size_t size_;
};
classSliceReader : public ::Hessian2::Reader {
public:SliceReader(Slice buffer) : buffer_(buffer){};
virtual~SliceReader() = default;
virtualvoidrawReadNBytes(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);
}
virtualuint64_tlength() constoverride { return buffer_.size_; }
private:
Slice buffer_;
};
classVectorWriter : public ::Hessian2::Writer {
public:VectorWriter(std::vector<uint8_t>& data) : data_(data) {}
~VectorWriter() = default;
virtualvoidrawWrite(constvoid* data, uint64_t size) {
constchar* src = static_cast<constchar*>(data);
for (size_t i = 0; i < size; i++) {
data_.push_back(src[i]);
}
}
virtualvoidrawWrite(absl::string_view data) {
for (auto& ch : data) {
data_.push_back(ch);
}
}
private:
std::vector<uint8_t>& data_;
};
intmain() {
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<constuint8_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;
}
}

Type mapping

C++ does not have a global parent like Java Object, so there is no single type that can represent all hessian types, so we create an Object base class from which all hessian types are inherited.

hessian typejava typeC++ type
nullnullNullObject
binarybyte[]BinaryObject
booleanbooleanBooleanObject
datejava.util.DateDateObject
doubledoubleDoubleObject
intintIntegerObject
longlongLongObject
stringjava.lang.StringStringObject
untyped listjava.util.ListUntypedListObject
typed listjava.util.ArrayListTypedListObject
untyped mapjava.util.MapUntypedMapObject
typed mapfor some OO languageTypedMapObject
objectcustom define objectClassInstance

Supported Platforms

hessian2-codec requires a codebase and compiler compliant with the C++14 standard or newer.

The hessian2-codec code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered.

If you notice any problems on your platform, please file an issue on the hessian2-codec GitHub Issue Tracker. Pull requests containing fixes are welcome!

Operating Systems

  • Linux
  • macOS
  • Windows(Theoretically, yes, but I haven't tested it.)

Compilers

  • gcc 7.0+
  • clang 7.0+

Build Systems

Who Is Using hessian2-codec?

In addition to many internal projects at Alibaba, hessian2-codec is also used by the following notable projects:

  • The Envoy (Dubbo Filter in Envoy will use hessian2-codec as the serializer).

Related Open Source Projects

Contributing

Please read CONTRIBUTING.md for details on how to contribute to this project.

Happy testing!

Develop

Generate compile_commands.json for this repo by bazel run :refresh_compile_commands. Thank https://github.com/hedronvision/bazel-compile-commands-extractor for it provide the great script/tool to make this so easy!

License

hessian2-codec is distributed under Apache License 2.0.

Acknowledgements

About

hessian2-codec it is a complete C++ implementation of hessian2 spec

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

30 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

hessian2-codec

CILicenseCoverage

hessian2-codec is a C++ library from Alibaba for hessian2 codec. It is a complete C++ implementation of hessian2 spec. Because it was originally intended to implement the Dubbo Filter of Envoy, it did not provide good support for serialization of user-defined types (there is only one way to implement user-defined types using ADL, but it is not very complete and does not support nested types well). At the moment it is simply deserializing content into some C++ intermediate types.

Getting Started

Install

  1. To download and install Bazel (and any of its dependencies), consult the Bazel Installation Guide.
  2. Refer to Supported Platforms installation related compiler.
  3. Use hessian2-codec, see the demo directory for details.
$ cd demo
$ bazel build //...
$ ./bazel-bin/demo

Basic usage

#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"intmain() {
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<std::string>("test string");
::Hessian2::Decoder decode(out);
auto ret = decode.decode<std::string>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<int64_t>(100);
::Hessian2::Decoder decode(out);
auto ret = decode.decode<int64_t>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
return0;
}

Advance usage

  1. Implement the serialization and deserialization of custom types with ADL
#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"structPerson {
int32_t age_{0};
std::string name_;
};
// The custom struct needs to implement from_hessian and to_hessian methods to// encode and decodevoidfromHessian(Person&, ::Hessian2::Decoder&);
booltoHessian(const Person&, ::Hessian2::Encoder&);
voidfromHessian(Person& p, ::Hessian2::Decoder& d) {
auto age = d.decode<int32_t>();
if (age) {
p.age_ = *age;
}
auto name = d.decode<std::string>();
if (name) {
p.name_ = *name;
}
}
booltoHessian(const Person& p, ::Hessian2::Encoder& e) {
e.encode<int32_t>(p.age_);
e.encode<std::string>(p.name_);
returntrue;
}
intmain() {
std::string out;
Hessian2::Encoder encode(out);
Person s;
s.age_ = 12;
s.name_ = "test";
encode.encode<Person>(s);
Hessian2::Decoder decode(out);
auto decode_person = decode.decode<Person>();
if (!decode_person) {
std::cerr << "hessian decode failed " << decode.getErrorMessage()
<< std::endl;
return -1;
}
std::cout << "Age: " << decode_person->age_
<< " Name: " << decode_person->name_ << std::endl;
}

There is currently no way to serialize container nested custom types such asstd::list<Person>.

  1. Customize Reader and Writer

Hessian2-codec uses the std::string implementation of reader and Writer by default, although we can customize both implementations.

#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"structSlice {
constuint8_t* data_;
size_t size_;
};
classSliceReader : public ::Hessian2::Reader {
public:SliceReader(Slice buffer) : buffer_(buffer){};
virtual~SliceReader() = default;
virtualvoidrawReadNBytes(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);
}
virtualuint64_tlength() constoverride { return buffer_.size_; }
private:
Slice buffer_;
};
classVectorWriter : public ::Hessian2::Writer {
public:VectorWriter(std::vector<uint8_t>& data) : data_(data) {}
~VectorWriter() = default;
virtualvoidrawWrite(constvoid* data, uint64_t size) {
constchar* src = static_cast<constchar*>(data);
for (size_t i = 0; i < size; i++) {
data_.push_back(src[i]);
}
}
virtualvoidrawWrite(absl::string_view data) {
for (auto& ch : data) {
data_.push_back(ch);
}
}
private:
std::vector<uint8_t>& data_;
};
intmain() {
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<constuint8_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;
}
}

Type mapping

C++ does not have a global parent like Java Object, so there is no single type that can represent all hessian types, so we create an Object base class from which all hessian types are inherited.

hessian typejava typeC++ type
nullnullNullObject
binarybyte[]BinaryObject
booleanbooleanBooleanObject
datejava.util.DateDateObject
doubledoubleDoubleObject
intintIntegerObject
longlongLongObject
stringjava.lang.StringStringObject
untyped listjava.util.ListUntypedListObject
typed listjava.util.ArrayListTypedListObject
untyped mapjava.util.MapUntypedMapObject
typed mapfor some OO languageTypedMapObject
objectcustom define objectClassInstance

Supported Platforms

hessian2-codec requires a codebase and compiler compliant with the C++14 standard or newer.

The hessian2-codec code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered.

If you notice any problems on your platform, please file an issue on the hessian2-codec GitHub Issue Tracker. Pull requests containing fixes are welcome!

Operating Systems

  • Linux
  • macOS
  • Windows(Theoretically, yes, but I haven't tested it.)

Compilers

  • gcc 7.0+
  • clang 7.0+

Build Systems

Who Is Using hessian2-codec?

In addition to many internal projects at Alibaba, hessian2-codec is also used by the following notable projects:

  • The Envoy (Dubbo Filter in Envoy will use hessian2-codec as the serializer).

Related Open Source Projects

Contributing

Please read CONTRIBUTING.md for details on how to contribute to this project.

Happy testing!

Develop

Generate compile_commands.json for this repo by bazel run :refresh_compile_commands. Thank https://github.com/hedronvision/bazel-compile-commands-extractor for it provide the great script/tool to make this so easy!

License

hessian2-codec is distributed under Apache License 2.0.

Acknowledgements

About

hessian2-codec it is a complete C++ implementation of hessian2 spec

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

30 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

hessian2-codec

CILicenseCoverage

hessian2-codec is a C++ library from Alibaba for hessian2 codec. It is a complete C++ implementation of hessian2 spec. Because it was originally intended to implement the Dubbo Filter of Envoy, it did not provide good support for serialization of user-defined types (there is only one way to implement user-defined types using ADL, but it is not very complete and does not support nested types well). At the moment it is simply deserializing content into some C++ intermediate types.

Getting Started

Install

  1. To download and install Bazel (and any of its dependencies), consult the Bazel Installation Guide.
  2. Refer to Supported Platforms installation related compiler.
  3. Use hessian2-codec, see the demo directory for details.
$ cd demo
$ bazel build //...
$ ./bazel-bin/demo

Basic usage

#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"intmain() {
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<std::string>("test string");
::Hessian2::Decoder decode(out);
auto ret = decode.decode<std::string>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<int64_t>(100);
::Hessian2::Decoder decode(out);
auto ret = decode.decode<int64_t>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
return0;
}

Advance usage

  1. Implement the serialization and deserialization of custom types with ADL
#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"structPerson {
int32_t age_{0};
std::string name_;
};
// The custom struct needs to implement from_hessian and to_hessian methods to// encode and decodevoidfromHessian(Person&, ::Hessian2::Decoder&);
booltoHessian(const Person&, ::Hessian2::Encoder&);
voidfromHessian(Person& p, ::Hessian2::Decoder& d) {
auto age = d.decode<int32_t>();
if (age) {
p.age_ = *age;
}
auto name = d.decode<std::string>();
if (name) {
p.name_ = *name;
}
}
booltoHessian(const Person& p, ::Hessian2::Encoder& e) {
e.encode<int32_t>(p.age_);
e.encode<std::string>(p.name_);
returntrue;
}
intmain() {
std::string out;
Hessian2::Encoder encode(out);
Person s;
s.age_ = 12;
s.name_ = "test";
encode.encode<Person>(s);
Hessian2::Decoder decode(out);
auto decode_person = decode.decode<Person>();
if (!decode_person) {
std::cerr << "hessian decode failed " << decode.getErrorMessage()
<< std::endl;
return -1;
}
std::cout << "Age: " << decode_person->age_
<< " Name: " << decode_person->name_ << std::endl;
}

There is currently no way to serialize container nested custom types such asstd::list<Person>.

  1. Customize Reader and Writer

Hessian2-codec uses the std::string implementation of reader and Writer by default, although we can customize both implementations.

#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"structSlice {
constuint8_t* data_;
size_t size_;
};
classSliceReader : public ::Hessian2::Reader {
public:SliceReader(Slice buffer) : buffer_(buffer){};
virtual~SliceReader() = default;
virtualvoidrawReadNBytes(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);
}
virtualuint64_tlength() constoverride { return buffer_.size_; }
private:
Slice buffer_;
};
classVectorWriter : public ::Hessian2::Writer {
public:VectorWriter(std::vector<uint8_t>& data) : data_(data) {}
~VectorWriter() = default;
virtualvoidrawWrite(constvoid* data, uint64_t size) {
constchar* src = static_cast<constchar*>(data);
for (size_t i = 0; i < size; i++) {
data_.push_back(src[i]);
}
}
virtualvoidrawWrite(absl::string_view data) {
for (auto& ch : data) {
data_.push_back(ch);
}
}
private:
std::vector<uint8_t>& data_;
};
intmain() {
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<constuint8_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;
}
}

Type mapping

C++ does not have a global parent like Java Object, so there is no single type that can represent all hessian types, so we create an Object base class from which all hessian types are inherited.

hessian typejava typeC++ type
nullnullNullObject
binarybyte[]BinaryObject
booleanbooleanBooleanObject
datejava.util.DateDateObject
doubledoubleDoubleObject
intintIntegerObject
longlongLongObject
stringjava.lang.StringStringObject
untyped listjava.util.ListUntypedListObject
typed listjava.util.ArrayListTypedListObject
untyped mapjava.util.MapUntypedMapObject
typed mapfor some OO languageTypedMapObject
objectcustom define objectClassInstance

Supported Platforms

hessian2-codec requires a codebase and compiler compliant with the C++14 standard or newer.

The hessian2-codec code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered.

If you notice any problems on your platform, please file an issue on the hessian2-codec GitHub Issue Tracker. Pull requests containing fixes are welcome!

Operating Systems

  • Linux
  • macOS
  • Windows(Theoretically, yes, but I haven't tested it.)

Compilers

  • gcc 7.0+
  • clang 7.0+

Build Systems

Who Is Using hessian2-codec?

In addition to many internal projects at Alibaba, hessian2-codec is also used by the following notable projects:

  • The Envoy (Dubbo Filter in Envoy will use hessian2-codec as the serializer).

Related Open Source Projects

Contributing

Please read CONTRIBUTING.md for details on how to contribute to this project.

Happy testing!

Develop

Generate compile_commands.json for this repo by bazel run :refresh_compile_commands. Thank https://github.com/hedronvision/bazel-compile-commands-extractor for it provide the great script/tool to make this so easy!

License

hessian2-codec is distributed under Apache License 2.0.

Acknowledgements

About

hessian2-codec it is a complete C++ implementation of hessian2 spec

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

30 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

hessian2-codec

CILicenseCoverage

hessian2-codec is a C++ library from Alibaba for hessian2 codec. It is a complete C++ implementation of hessian2 spec. Because it was originally intended to implement the Dubbo Filter of Envoy, it did not provide good support for serialization of user-defined types (there is only one way to implement user-defined types using ADL, but it is not very complete and does not support nested types well). At the moment it is simply deserializing content into some C++ intermediate types.

Getting Started

Install

  1. To download and install Bazel (and any of its dependencies), consult the Bazel Installation Guide.
  2. Refer to Supported Platforms installation related compiler.
  3. Use hessian2-codec, see the demo directory for details.
$ cd demo
$ bazel build //...
$ ./bazel-bin/demo

Basic usage

#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"intmain() {
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<std::string>("test string");
::Hessian2::Decoder decode(out);
auto ret = decode.decode<std::string>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<int64_t>(100);
::Hessian2::Decoder decode(out);
auto ret = decode.decode<int64_t>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
return0;
}

Advance usage

  1. Implement the serialization and deserialization of custom types with ADL
#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"structPerson {
int32_t age_{0};
std::string name_;
};
// The custom struct needs to implement from_hessian and to_hessian methods to// encode and decodevoidfromHessian(Person&, ::Hessian2::Decoder&);
booltoHessian(const Person&, ::Hessian2::Encoder&);
voidfromHessian(Person& p, ::Hessian2::Decoder& d) {
auto age = d.decode<int32_t>();
if (age) {
p.age_ = *age;
}
auto name = d.decode<std::string>();
if (name) {
p.name_ = *name;
}
}
booltoHessian(const Person& p, ::Hessian2::Encoder& e) {
e.encode<int32_t>(p.age_);
e.encode<std::string>(p.name_);
returntrue;
}
intmain() {
std::string out;
Hessian2::Encoder encode(out);
Person s;
s.age_ = 12;
s.name_ = "test";
encode.encode<Person>(s);
Hessian2::Decoder decode(out);
auto decode_person = decode.decode<Person>();
if (!decode_person) {
std::cerr << "hessian decode failed " << decode.getErrorMessage()
<< std::endl;
return -1;
}
std::cout << "Age: " << decode_person->age_
<< " Name: " << decode_person->name_ << std::endl;
}

There is currently no way to serialize container nested custom types such asstd::list<Person>.

  1. Customize Reader and Writer

Hessian2-codec uses the std::string implementation of reader and Writer by default, although we can customize both implementations.

#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"structSlice {
constuint8_t* data_;
size_t size_;
};
classSliceReader : public ::Hessian2::Reader {
public:SliceReader(Slice buffer) : buffer_(buffer){};
virtual~SliceReader() = default;
virtualvoidrawReadNBytes(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);
}
virtualuint64_tlength() constoverride { return buffer_.size_; }
private:
Slice buffer_;
};
classVectorWriter : public ::Hessian2::Writer {
public:VectorWriter(std::vector<uint8_t>& data) : data_(data) {}
~VectorWriter() = default;
virtualvoidrawWrite(constvoid* data, uint64_t size) {
constchar* src = static_cast<constchar*>(data);
for (size_t i = 0; i < size; i++) {
data_.push_back(src[i]);
}
}
virtualvoidrawWrite(absl::string_view data) {
for (auto& ch : data) {
data_.push_back(ch);
}
}
private:
std::vector<uint8_t>& data_;
};
intmain() {
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<constuint8_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;
}
}

Type mapping

C++ does not have a global parent like Java Object, so there is no single type that can represent all hessian types, so we create an Object base class from which all hessian types are inherited.

hessian typejava typeC++ type
nullnullNullObject
binarybyte[]BinaryObject
booleanbooleanBooleanObject
datejava.util.DateDateObject
doubledoubleDoubleObject
intintIntegerObject
longlongLongObject
stringjava.lang.StringStringObject
untyped listjava.util.ListUntypedListObject
typed listjava.util.ArrayListTypedListObject
untyped mapjava.util.MapUntypedMapObject
typed mapfor some OO languageTypedMapObject
objectcustom define objectClassInstance

Supported Platforms

hessian2-codec requires a codebase and compiler compliant with the C++14 standard or newer.

The hessian2-codec code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered.

If you notice any problems on your platform, please file an issue on the hessian2-codec GitHub Issue Tracker. Pull requests containing fixes are welcome!

Operating Systems

  • Linux
  • macOS
  • Windows(Theoretically, yes, but I haven't tested it.)

Compilers

  • gcc 7.0+
  • clang 7.0+

Build Systems

Who Is Using hessian2-codec?

In addition to many internal projects at Alibaba, hessian2-codec is also used by the following notable projects:

  • The Envoy (Dubbo Filter in Envoy will use hessian2-codec as the serializer).

Related Open Source Projects

Contributing

Please read CONTRIBUTING.md for details on how to contribute to this project.

Happy testing!

Develop

Generate compile_commands.json for this repo by bazel run :refresh_compile_commands. Thank https://github.com/hedronvision/bazel-compile-commands-extractor for it provide the great script/tool to make this so easy!

License

hessian2-codec is distributed under Apache License 2.0.

Acknowledgements

About

hessian2-codec it is a complete C++ implementation of hessian2 spec

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

30 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

hessian2-codec

CILicenseCoverage

hessian2-codec is a C++ library from Alibaba for hessian2 codec. It is a complete C++ implementation of hessian2 spec. Because it was originally intended to implement the Dubbo Filter of Envoy, it did not provide good support for serialization of user-defined types (there is only one way to implement user-defined types using ADL, but it is not very complete and does not support nested types well). At the moment it is simply deserializing content into some C++ intermediate types.

Getting Started

Install

  1. To download and install Bazel (and any of its dependencies), consult the Bazel Installation Guide.
  2. Refer to Supported Platforms installation related compiler.
  3. Use hessian2-codec, see the demo directory for details.
$ cd demo
$ bazel build //...
$ ./bazel-bin/demo

Basic usage

#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"intmain() {
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<std::string>("test string");
::Hessian2::Decoder decode(out);
auto ret = decode.decode<std::string>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<int64_t>(100);
::Hessian2::Decoder decode(out);
auto ret = decode.decode<int64_t>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
return0;
}

Advance usage

  1. Implement the serialization and deserialization of custom types with ADL
#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"structPerson {
int32_t age_{0};
std::string name_;
};
// The custom struct needs to implement from_hessian and to_hessian methods to// encode and decodevoidfromHessian(Person&, ::Hessian2::Decoder&);
booltoHessian(const Person&, ::Hessian2::Encoder&);
voidfromHessian(Person& p, ::Hessian2::Decoder& d) {
auto age = d.decode<int32_t>();
if (age) {
p.age_ = *age;
}
auto name = d.decode<std::string>();
if (name) {
p.name_ = *name;
}
}
booltoHessian(const Person& p, ::Hessian2::Encoder& e) {
e.encode<int32_t>(p.age_);
e.encode<std::string>(p.name_);
returntrue;
}
intmain() {
std::string out;
Hessian2::Encoder encode(out);
Person s;
s.age_ = 12;
s.name_ = "test";
encode.encode<Person>(s);
Hessian2::Decoder decode(out);
auto decode_person = decode.decode<Person>();
if (!decode_person) {
std::cerr << "hessian decode failed " << decode.getErrorMessage()
<< std::endl;
return -1;
}
std::cout << "Age: " << decode_person->age_
<< " Name: " << decode_person->name_ << std::endl;
}

There is currently no way to serialize container nested custom types such asstd::list<Person>.

  1. Customize Reader and Writer

Hessian2-codec uses the std::string implementation of reader and Writer by default, although we can customize both implementations.

#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"structSlice {
constuint8_t* data_;
size_t size_;
};
classSliceReader : public ::Hessian2::Reader {
public:SliceReader(Slice buffer) : buffer_(buffer){};
virtual~SliceReader() = default;
virtualvoidrawReadNBytes(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);
}
virtualuint64_tlength() constoverride { return buffer_.size_; }
private:
Slice buffer_;
};
classVectorWriter : public ::Hessian2::Writer {
public:VectorWriter(std::vector<uint8_t>& data) : data_(data) {}
~VectorWriter() = default;
virtualvoidrawWrite(constvoid* data, uint64_t size) {
constchar* src = static_cast<constchar*>(data);
for (size_t i = 0; i < size; i++) {
data_.push_back(src[i]);
}
}
virtualvoidrawWrite(absl::string_view data) {
for (auto& ch : data) {
data_.push_back(ch);
}
}
private:
std::vector<uint8_t>& data_;
};
intmain() {
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<constuint8_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;
}
}

Type mapping

C++ does not have a global parent like Java Object, so there is no single type that can represent all hessian types, so we create an Object base class from which all hessian types are inherited.

hessian typejava typeC++ type
nullnullNullObject
binarybyte[]BinaryObject
booleanbooleanBooleanObject
datejava.util.DateDateObject
doubledoubleDoubleObject
intintIntegerObject
longlongLongObject
stringjava.lang.StringStringObject
untyped listjava.util.ListUntypedListObject
typed listjava.util.ArrayListTypedListObject
untyped mapjava.util.MapUntypedMapObject
typed mapfor some OO languageTypedMapObject
objectcustom define objectClassInstance

Supported Platforms

hessian2-codec requires a codebase and compiler compliant with the C++14 standard or newer.

The hessian2-codec code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered.

If you notice any problems on your platform, please file an issue on the hessian2-codec GitHub Issue Tracker. Pull requests containing fixes are welcome!

Operating Systems

  • Linux
  • macOS
  • Windows(Theoretically, yes, but I haven't tested it.)

Compilers

  • gcc 7.0+
  • clang 7.0+

Build Systems

Who Is Using hessian2-codec?

In addition to many internal projects at Alibaba, hessian2-codec is also used by the following notable projects:

  • The Envoy (Dubbo Filter in Envoy will use hessian2-codec as the serializer).

Related Open Source Projects

Contributing

Please read CONTRIBUTING.md for details on how to contribute to this project.

Happy testing!

Develop

Generate compile_commands.json for this repo by bazel run :refresh_compile_commands. Thank https://github.com/hedronvision/bazel-compile-commands-extractor for it provide the great script/tool to make this so easy!

License

hessian2-codec is distributed under Apache License 2.0.

Acknowledgements

About

hessian2-codec it is a complete C++ implementation of hessian2 spec

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

30 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

hessian2-codec

CILicenseCoverage

hessian2-codec is a C++ library from Alibaba for hessian2 codec. It is a complete C++ implementation of hessian2 spec. Because it was originally intended to implement the Dubbo Filter of Envoy, it did not provide good support for serialization of user-defined types (there is only one way to implement user-defined types using ADL, but it is not very complete and does not support nested types well). At the moment it is simply deserializing content into some C++ intermediate types.

Getting Started

Install

  1. To download and install Bazel (and any of its dependencies), consult the Bazel Installation Guide.
  2. Refer to Supported Platforms installation related compiler.
  3. Use hessian2-codec, see the demo directory for details.
$ cd demo
$ bazel build //...
$ ./bazel-bin/demo

Basic usage

#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"intmain() {
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<std::string>("test string");
::Hessian2::Decoder decode(out);
auto ret = decode.decode<std::string>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<int64_t>(100);
::Hessian2::Decoder decode(out);
auto ret = decode.decode<int64_t>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
return0;
}

Advance usage

  1. Implement the serialization and deserialization of custom types with ADL
#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"structPerson {
int32_t age_{0};
std::string name_;
};
// The custom struct needs to implement from_hessian and to_hessian methods to// encode and decodevoidfromHessian(Person&, ::Hessian2::Decoder&);
booltoHessian(const Person&, ::Hessian2::Encoder&);
voidfromHessian(Person& p, ::Hessian2::Decoder& d) {
auto age = d.decode<int32_t>();
if (age) {
p.age_ = *age;
}
auto name = d.decode<std::string>();
if (name) {
p.name_ = *name;
}
}
booltoHessian(const Person& p, ::Hessian2::Encoder& e) {
e.encode<int32_t>(p.age_);
e.encode<std::string>(p.name_);
returntrue;
}
intmain() {
std::string out;
Hessian2::Encoder encode(out);
Person s;
s.age_ = 12;
s.name_ = "test";
encode.encode<Person>(s);
Hessian2::Decoder decode(out);
auto decode_person = decode.decode<Person>();
if (!decode_person) {
std::cerr << "hessian decode failed " << decode.getErrorMessage()
<< std::endl;
return -1;
}
std::cout << "Age: " << decode_person->age_
<< " Name: " << decode_person->name_ << std::endl;
}

There is currently no way to serialize container nested custom types such asstd::list<Person>.

  1. Customize Reader and Writer

Hessian2-codec uses the std::string implementation of reader and Writer by default, although we can customize both implementations.

#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"structSlice {
constuint8_t* data_;
size_t size_;
};
classSliceReader : public ::Hessian2::Reader {
public:SliceReader(Slice buffer) : buffer_(buffer){};
virtual~SliceReader() = default;
virtualvoidrawReadNBytes(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);
}
virtualuint64_tlength() constoverride { return buffer_.size_; }
private:
Slice buffer_;
};
classVectorWriter : public ::Hessian2::Writer {
public:VectorWriter(std::vector<uint8_t>& data) : data_(data) {}
~VectorWriter() = default;
virtualvoidrawWrite(constvoid* data, uint64_t size) {
constchar* src = static_cast<constchar*>(data);
for (size_t i = 0; i < size; i++) {
data_.push_back(src[i]);
}
}
virtualvoidrawWrite(absl::string_view data) {
for (auto& ch : data) {
data_.push_back(ch);
}
}
private:
std::vector<uint8_t>& data_;
};
intmain() {
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<constuint8_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;
}
}

Type mapping

C++ does not have a global parent like Java Object, so there is no single type that can represent all hessian types, so we create an Object base class from which all hessian types are inherited.

hessian typejava typeC++ type
nullnullNullObject
binarybyte[]BinaryObject
booleanbooleanBooleanObject
datejava.util.DateDateObject
doubledoubleDoubleObject
intintIntegerObject
longlongLongObject
stringjava.lang.StringStringObject
untyped listjava.util.ListUntypedListObject
typed listjava.util.ArrayListTypedListObject
untyped mapjava.util.MapUntypedMapObject
typed mapfor some OO languageTypedMapObject
objectcustom define objectClassInstance

Supported Platforms

hessian2-codec requires a codebase and compiler compliant with the C++14 standard or newer.

The hessian2-codec code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered.

If you notice any problems on your platform, please file an issue on the hessian2-codec GitHub Issue Tracker. Pull requests containing fixes are welcome!

Operating Systems

  • Linux
  • macOS
  • Windows(Theoretically, yes, but I haven't tested it.)

Compilers

  • gcc 7.0+
  • clang 7.0+

Build Systems

Who Is Using hessian2-codec?

In addition to many internal projects at Alibaba, hessian2-codec is also used by the following notable projects:

  • The Envoy (Dubbo Filter in Envoy will use hessian2-codec as the serializer).

Related Open Source Projects

Contributing

Please read CONTRIBUTING.md for details on how to contribute to this project.

Happy testing!

Develop

Generate compile_commands.json for this repo by bazel run :refresh_compile_commands. Thank https://github.com/hedronvision/bazel-compile-commands-extractor for it provide the great script/tool to make this so easy!

License

hessian2-codec is distributed under Apache License 2.0.

Acknowledgements

About

hessian2-codec it is a complete C++ implementation of hessian2 spec

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

30 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

hessian2-codec

CILicenseCoverage

hessian2-codec is a C++ library from Alibaba for hessian2 codec. It is a complete C++ implementation of hessian2 spec. Because it was originally intended to implement the Dubbo Filter of Envoy, it did not provide good support for serialization of user-defined types (there is only one way to implement user-defined types using ADL, but it is not very complete and does not support nested types well). At the moment it is simply deserializing content into some C++ intermediate types.

Getting Started

Install

  1. To download and install Bazel (and any of its dependencies), consult the Bazel Installation Guide.
  2. Refer to Supported Platforms installation related compiler.
  3. Use hessian2-codec, see the demo directory for details.
$ cd demo
$ bazel build //...
$ ./bazel-bin/demo

Basic usage

#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"intmain() {
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<std::string>("test string");
::Hessian2::Decoder decode(out);
auto ret = decode.decode<std::string>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
{
std::string out;
::Hessian2::Encoder encode(out);
encode.encode<int64_t>(100);
::Hessian2::Decoder decode(out);
auto ret = decode.decode<int64_t>();
if (ret) {
std::cout << *ret << std::endl;
} else {
std::cerr << "decode failed: " << decode.getErrorMessage() << std::endl;
}
}
return0;
}

Advance usage

  1. Implement the serialization and deserialization of custom types with ADL
#include<iostream>
#include"hessian2/codec.hpp"
#include"hessian2/basic_codec/object_codec.hpp"structPerson {
int32_t age_{0};
std::string name_;
};
// The custom struct needs to implement from_hessian and to_hessian methods to// encode and decodevoidfromHessian(Person&, ::Hessian2::Decoder&);
booltoHessian(const Person&, ::Hessian2::Encoder&);
voidfromHessian(Person& p, ::Hessian2::Decoder& d) {
auto age = d.decode<int32_t>();
if (age) {
p.age_ = *age;
}
auto name = d.decode<std::string>();
if (name) {
p.name_ = *name;
}
}
booltoHessian(const Person& p, ::Hessian2::Encoder& e) {
e.encode<int32_t>(p.age_);
e.encode<std::string>(p.name_);
returntrue;
}
intmain() {
std::string out;
Hessian2::Encoder encode(out);
Person s;
s.age_ = 12;
s.name_ = "test";
encode.encode<Person>(s);
Hessian2::Decoder decode(out);
auto decode_person = decode.decode<Person>();
if (!decode_person) {
std::cerr << "hessian decode failed " << decode.getErrorMessage()
<< std::endl;
return -1;
}
std::cout << "Age: " << decode_person->age_
<< " Name: " << decode_person->name_ << std::endl;
}

There is currently no way to serialize container nested custom types such asstd::list<Person>.

  1. Customize Reader and Writer

Hessian2-codec uses the std::string implementation of reader and Writer by default, although we can customize both implementations.

#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"structSlice {
constuint8_t* data_;
size_t size_;
};
classSliceReader : public ::Hessian2::Reader {
public:SliceReader(Slice buffer) : buffer_(buffer){};
virtual~SliceReader() = default;
virtualvoidrawReadNBytes(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);
}
virtualuint64_tlength() constoverride { return buffer_.size_; }
private:
Slice buffer_;
};
classVectorWriter : public ::Hessian2::Writer {
public:VectorWriter(std::vector<uint8_t>& data) : data_(data) {}
~VectorWriter() = default;
virtualvoidrawWrite(constvoid* data, uint64_t size) {
constchar* src = static_cast<constchar*>(data);
for (size_t i = 0; i < size; i++) {
data_.push_back(src[i]);
}
}
virtualvoidrawWrite(absl::string_view data) {
for (auto& ch : data) {
data_.push_back(ch);
}
}
private:
std::vector<uint8_t>& data_;
};
intmain() {
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<constuint8_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;
}
}

Type mapping

C++ does not have a global parent like Java Object, so there is no single type that can represent all hessian types, so we create an Object base class from which all hessian types are inherited.

hessian typejava typeC++ type
nullnullNullObject
binarybyte[]BinaryObject
booleanbooleanBooleanObject
datejava.util.DateDateObject
doubledoubleDoubleObject
intintIntegerObject
longlongLongObject
stringjava.lang.StringStringObject
untyped listjava.util.ListUntypedListObject
typed listjava.util.ArrayListTypedListObject
untyped mapjava.util.MapUntypedMapObject
typed mapfor some OO languageTypedMapObject
objectcustom define objectClassInstance

Supported Platforms

hessian2-codec requires a codebase and compiler compliant with the C++14 standard or newer.

The hessian2-codec code is officially supported on the following platforms. Operating systems or tools not listed below are community-supported. For community-supported platforms, patches that do not complicate the code may be considered.

If you notice any problems on your platform, please file an issue on the hessian2-codec GitHub Issue Tracker. Pull requests containing fixes are welcome!

Operating Systems

  • Linux
  • macOS
  • Windows(Theoretically, yes, but I haven't tested it.)

Compilers

  • gcc 7.0+
  • clang 7.0+

Build Systems

Who Is Using hessian2-codec?

In addition to many internal projects at Alibaba, hessian2-codec is also used by the following notable projects:

  • The Envoy (Dubbo Filter in Envoy will use hessian2-codec as the serializer).

Related Open Source Projects

Contributing

Please read CONTRIBUTING.md for details on how to contribute to this project.

Happy testing!

Develop

Generate compile_commands.json for this repo by bazel run :refresh_compile_commands. Thank https://github.com/hedronvision/bazel-compile-commands-extractor for it provide the great script/tool to make this so easy!

License

hessian2-codec is distributed under Apache License 2.0.

Acknowledgements

About

hessian2-codec it is a complete C++ implementation of hessian2 spec

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

30 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages