为BinaryBuffer支持std::map<K,V>的序列化和反序列化 #3

Closed
opened 2024-03-04 11:02:13 +00:00 by szTom · 0 comments
Owner

添加运算符重载

template <typename K, typename V>
BinaryBuffer& operator<<(const std::map<K, V> &);
template <typename K, typename V>
BinaryBuffer& operator>>(std::map<K, V> &);

二进制结构形同

template <typename K, typename V>
struct MapItem {
	K key;
	V value;
};

template <typename K, typename V>
struct Map {
	std::vector<MapItem<K, V>> values;
};

可参考 JavaScript 实现:

/**
* Handles map with keys and values are of the same type.
* @extends {BaseTypeHandler}
* @class
*/
export class MapHandler extends BaseTypeHandler {
/**
* Constructor for MapHandler.
* @param {BaseTypeHandler} key_handler - The handler for keys of the map.
* @param {BaseTypeHandler} value_handler - The handler for values of the map.
*/
constructor(key_handler, value_handler) {
super();
this.key_handler = getHandlerObject(key_handler);
this.value_handler = getHandlerObject(value_handler);
}
/**
* Gets the size of the serialized map in bytes.
* @param {Map} value - The map to calculate the size for.
* @returns {number} - The size of the serialized map in bytes.
*/
sizeof(value) {
let res = 4;
for (const [k, v] of value) {
res += this.key_handler.sizeof(k);
res += this.value_handler.sizeof(v);
}
return res;
}
/**
* Serializes the map and writes it to the DataView at the specified offset.
* @param {DataView} view - The DataView to write to.
* @param {number} offset - The offset to start writing at.
* @param {Map} value - The map to be serialized.
* @returns {number} - The new offset after serialization.
*/
serialize(view, offset, value) {
view.setUint32(offset, value.size, true);
offset += 4;
for (const [k, v] of value) {
offset = this.key_handler.serialize(view, offset, k);
offset = this.value_handler.serialize(view, offset, v);
}
return offset;
}
/**
* Deserializes the map from the DataView at the specified offset.
* @param {DataView} view - The DataView to read from.
* @param {number} offset - The offset to start reading from.
* @returns {DeserializedResult} - The deserialized result containing the map and a new offset.
*/
deserialize(view, offset) {
const size = view.getUint32(offset, true);
offset += 4;
const res = new Map();
for (let i = 0; i < size; i += 1) {
const resk = this.key_handler.deserialize(view, offset);
const resv = this.value_handler.deserialize(view, resk.offset);
offset = resv.offset;
res.set(resk.value, resv.value);
}
return new DeserializedResult(res, offset);
}
}

预计用时 15-45 分钟

https://git.gzezfisher.top/szTom/opengenerals/src/commit/f2434a595385c13be3056e8fc8e564a9a8fdd0eb/processor/pc/BinaryBuffer.h#L81 添加运算符重载 ```cpp template <typename K, typename V> BinaryBuffer& operator<<(const std::map<K, V> &); template <typename K, typename V> BinaryBuffer& operator>>(std::map<K, V> &); ``` 二进制结构形同 ```cpp template <typename K, typename V> struct MapItem { K key; V value; }; template <typename K, typename V> struct Map { std::vector<MapItem<K, V>> values; }; ``` 可参考 JavaScript 实现: https://git.gzezfisher.top/szTom/opengenerals/src/commit/f2434a595385c13be3056e8fc8e564a9a8fdd0eb/shared/bstruct/type-handler.mjs#L736-L802 预计用时 15-45 分钟
szTom closed this issue 2024-03-05 15:19:39 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: szTom/opengenerals#3
No description provided.